W przypadku dwóch środowisk, lokalnego i chmury, jak skonfigurować niestandardowe ustawienia lub parametry zasobów, takich jak bazy danych Sql, konta magazynu itp ... Idealnie byłoby to jedna nazwa parametru wywoływana w kodzie, aby powiedzieć, że wskazuje kontekst DbContext na konkretny bazy danych, które w konfiguracjach dla środowiska lokalnego lub chmury są różne. Dziękuję Ci.
azure
azure-sql-database
azure-service-fabric
StampyTurtle
źródło
źródło
Odpowiedzi:
Aby mieć zmienne środowiskowe na potrzeby uruchamiania usługi Service Fabric lokalnie iw chmurze, należy wykonać następujące czynności:
<?xml version="1.0" encoding="utf-8" ?> <Settings xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2011/01/fabric"> <!-- Add your custom configuration sections and parameters here --> <Section Name="UserDatabase"> <Parameter Name="UserDatabaseConnectionString" Value="" /> </Section> </Settings>
<ServiceManifestImport>
elementy dla każdego z dołączonych projektów. Poniżej znajduje się<ConfigOverrides>
element, w którym zadeklarujemy, jakie wartości dla naszych konfiguracji zostaną zastąpione przez wartości ustawione na środowisko w lokalnych i chmurowych plikach xml pod ApplicationParameters w naszym projekcie usługi Service Fabric. W tym samym pliku ApplicationManifest.xml musisz dodać parametr, który będzie obecny w lokalnych i chmurowych plikach xml, w przeciwnym razie zostaną one nadpisane podczas kompilacji.Kontynuując powyższy przykład, tak zostałoby to ustawione.
<Parameters> <Parameter Name="ServiceName_InstanceCount" DefaultValue="-1" /> <Parameter Name="UserDatabaseConnectionString" DefaultValue="" /> </Parameters> <ConfigOverrides> <ConfigOverride Name="Config"> <Settings> <Section Name="UserDatabase"> <Parameter Name="UserDatabaseConnectionString" Value="[UserDatabaseConnectionString]" /> </Section> </Settings> </ConfigOverride> </ConfigOverrides>
<?xml version="1.0" encoding="utf-8"?> <Application xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="fabric:/AppFabricName.ServiceFabric" xmlns="http://schemas.microsoft.com/2011/01/fabric"> <Parameters> <Parameter Name="ServiceName_InstanceCount" Value="1" /> <Parameter Name="UserDatabaseConnectionString" Value="Server=(localdb)\MsSqlLocalDb;Database=Users;User=ReadOnlyUser;Password=XXXXX;" /> </Parameters> </Application>
var configurationPackage = Context.CodePackageActivationContext.GetConfigurationPackageObject("Config"); var connectionStringParameter = configurationPackage.Settings.Sections["UserDatabase"].Parameters["UserDatabaseConnectionString"];
źródło
ServiceManifestImport
(dzieckoApplicationManifest
), aleConfigOverrides
musisz w nim wejść (dzieckoServiceManifestImport
).Możesz po prostu użyć zmiennych środowiskowych, tak jak każdej innej aplikacji, działa to również z plikiem wykonywalnym gościa w ramach usługi Service Fabric, w przeciwieństwie do
settings.xml
tego, ponieważ wymaga to wbudowanego środowiska uruchomieniowego usługi Service Fabric.W swojej aplikacji możesz uzyskać dostęp do zmiennych środowiskowych, tak jak do każdej innej aplikacji .net, poprzez
GetEnvironmentVariable
metodęEnvironment
klasy:var baseUri = Environment.GetEnvironmentVariable("SuperWebServiceBaseUri");
Następnie musimy ustawić domyślne wartości zmiennych środowiskowych, odbywa się to w
ServiceManifest.xml
pliku manifestu usługi.<?xml version="1.0" encoding="utf-8" ?> <ServiceManifest Name="MyServicePkg" Version="1.0.0" xmlns="http://schemas.microsoft.com/2011/01/fabric" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <!-- snip --> <CodePackage Name="Code" Version="1.0.0"> <!-- snip --> <EnvironmentVariables> <EnvironmentVariable Name="SuperWebServiceBaseUri" Value="http://localhost:12345"/> </EnvironmentVariables> </CodePackage> <!-- snip --> </ServiceManifest>
Te zmienne środowiskowe można następnie zastąpić w
ApplicationManifest.xml
pliku przy użyciu następującego kodu:<?xml version="1.0" encoding="utf-8"?> <ApplicationManifest xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ApplicationTypeName="ChileTargetType" ApplicationTypeVersion="1.0.0" xmlns="http://schemas.microsoft.com/2011/01/fabric"> <Parameters> <!-- snip --> </Parameters> <ServiceManifestImport> <ServiceManifestRef ServiceManifestName="MyServicePkg" ServiceManifestVersion="1.0.0" /> <EnvironmentOverrides CodePackageRef="Code"> <EnvironmentVariable Name="SuperWebServiceBaseUri" Value="https://the-real-live-super-base-uri.com/"/> </EnvironmentOverrides> </ServiceManifestImport> <!-- snip --> </ApplicationManifest>
Można to następnie sparametryzować jak każde inne ustawienie manifestu aplikacji przy użyciu
local.xml
icloud.xml
.<?xml version="1.0" encoding="utf-8"?> <Application xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="fabric:/AppFabricName.ServiceFabric" xmlns="http://schemas.microsoft.com/2011/01/fabric"> <Parameters> <Parameter Name="MyService_SuperWebServiceBaseUri" Value="https://another-base-uri.com/" /> </Parameters> </Application>
Następnie będziemy musieli zaktualizować,
ApplicationManifest.xml
aby obsługiwał te parametry;<?xml version="1.0" encoding="utf-8"?> <ApplicationManifest xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ApplicationTypeName="ChileTargetType" ApplicationTypeVersion="1.0.0" xmlns="http://schemas.microsoft.com/2011/01/fabric"> <Parameters> <Parameter Name="MyService_SuperWebServiceBaseUri" DefaultValue="https://the-real-live-super-base-uri.com/" /> </Parameters> <ServiceManifestImport> <ServiceManifestRef ServiceManifestName="MyServicePkg" ServiceManifestVersion="1.0.0" /> <EnvironmentOverrides CodePackageRef="Code"> <EnvironmentVariable Name="SuperWebServiceBaseUri" Value="[MyService_SuperWebServiceBaseUri]"/> </EnvironmentOverrides> </ServiceManifestImport> <!-- snip --> </ApplicationManifest>
źródło
Powyższe odpowiedzi dobrze wyjaśniają, jak to się robi. Chcę dodać sidemark, dlaczego jest to „ zawiłe ”:
Musi tak być, ponieważ usługi mają być samowystarczalne. Powinny działać domyślnie w każdej aplikacji, z którą są połączone. Niezależnie od manifestu aplikacji. Usługa może więc polegać tylko na parametrach, które są przynajmniej wstępnie zdefiniowane w jej własnej konfiguracji.
Te ustawienia wstępne mogą być następnie nadpisane przez aplikację. To jedyne uniwersalne podejście.
źródło