Где вы устанавливаете и получаете доступ к параметрам конфигурации времени выполнения для каждой среды для сервисной структуры?
Для двух сред, локальной и облачной, как мне настроить пользовательские настройки или параметры для таких ресурсов, как базы данных Sql, учетные записи хранения и т. Д. В идеале это было бы одно имя параметра, вызываемое в коде, чтобы указать, направить DbContext на определенный базы данных, которые в конфигурациях для локальной или облачной среды будут разными. Спасибо.
3 ответа
Для того чтобы иметь переменные среды для запуска Service Fabric локально и в облаке, это то, что вы должны сделать:
- Добавьте свой настраиваемый раздел конфигурации и параметры в файл Settings.xml проекта Service/Actor (расположенный по адресу \PackageRoot\Config\Settings.xml в корневом каталоге проекта). Оставьте параметры пустыми, так как мы будем устанавливать их в другом месте для каждой среды. Вот пример один.
<?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>
- В файле ApplicationManifest.xml вашего проекта Service Fabric будет
<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>
- В файлах local.xml и cloud.xml под ApplicationParameters вашего проекта Service Fabric вы будете указывать переменные, специфичные для вашей среды.
<?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>
- Наконец, в вашем Service/Actor вы можете получить доступ к этим переменным конфигурации для каждой среды следующим образом.
var configurationPackage = Context.CodePackageActivationContext.GetConfigurationPackageObject("Config");
var connectionStringParameter = configurationPackage.Settings.Sections["UserDatabase"].Parameters["UserDatabaseConnectionString"];
Вы можете просто использовать переменные среды, как и любое другое приложение, это также работает с гостевым исполняемым файлом в сервисной фабрике в отличие от 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>
Приведенные выше ответы хорошо объясняют, как это делается. Я хочу добавить побочный знак, почему это так "запутанно":
Так должно быть, так как сервисы предназначены быть автономными. Они должны запускаться по умолчанию в любом приложении, с которым они связаны. Независимо от манифеста приложения. Таким образом, сервис может полагаться только на параметры, которые, по крайней мере, предопределены в его собственной конфигурации.
Эти предварительные настройки могут быть перезаписаны приложением. Это единственный универсальный подход.