Для двух сред, локальной и облачной, как мне настроить пользовательские настройки или параметры для ресурсов, таких как базы данных Sql, учетные записи хранения и т. Д. ... В идеале это было бы одно имя параметра, вызываемое в коде, чтобы сказать, указывать DbContext на конкретный база данных, которая в конфигурациях для локальной или облачной среды различается. Спасибо.
azure
azure-sql-database
azure-service-fabric
StampyTurtle
источник
источник
Ответы:
Вот что вам нужно сделать, чтобы иметь переменные среды для локального и облачного запуска Service Fabric:
<?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>
элементы для каждого из ваших включенных проектов. Под ним будет<ConfigOverrides>
элемент, в котором мы объявим, какие значения для наших конфигураций будут заменены значениями, установленными для каждой среды в локальных и облачных xml-файлах под ApplicationParameters в нашем проекте Service Fabric. В том же файле ApplicationManifest.xml вам нужно будет добавить параметр, который будет присутствовать в локальном и облачном XML-файлах, иначе они будут перезаписаны при сборке.Продолжая приведенный выше пример, это будет так.
<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"];
источник
ServiceManifestImport
(дочерний элементApplicationManifest
), ноConfigOverrides
должны войти в него (дочерний элементServiceManifestImport
).Вы можете просто использовать переменные среды, как и любое другое приложение, это также работает с гостевым исполняемым файлом в служебной структуре, в отличие от,
settings.xml
поскольку для этого требуется встроенная среда выполнения служебной структуры.В вашем приложении вы можете получить доступ к переменным среды, как и к любому другому .NET-приложению, с помощью
GetEnvironmentVariable
методаEnvironment
класса:var baseUri = Environment.GetEnvironmentVariable("SuperWebServiceBaseUri");
Затем нам нужно установить некоторые значения переменных среды по умолчанию, это делается в
ServiceManifest.xml
файле манифеста службы.<?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>
Затем эти переменные среды можно переопределить в
ApplicationManifest.xml
файле с помощью следующего кода:<?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>
Затем его можно параметризовать, как и любой другой параметр манифеста приложения, с помощью
local.xml
иcloud.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>
Затем нам нужно обновить,
ApplicationManifest.xml
чтобы поддерживать эти параметры;<?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>
источник
Приведенные выше ответы хорошо объясняют, как это делается. Я хочу добавить боковой знак, почему он такой « запутанный »:
Так и должно быть, так как сервисы должны быть автономными. По умолчанию они должны запускаться в любом приложении, с которым связаны. Независимо от манифеста приложения. Таким образом, служба может полагаться только на параметры, которые, по крайней мере, предопределены в ее собственной конфигурации.
Эти предварительные настройки затем могут быть перезаписаны приложением. Это единственный универсальный подход.
источник