您在哪里为服务结构设置和访问每个环境的运行时configuration参数?

对于两个环境,本地和云,我将如何设置资源的自定义设置或参数,如Sql数据库,存储帐户等…理想情况下,这将是一个参数名称调用代码说,指向一个DbContext特定数据库,在本地或云环境的configuration中不同。 谢谢。

为了让每个环境variables在本地和云中运行Service Fabric,您必须执行以下操作:

  1. 将您的自定义configuration部分和参数添加到Service / Actor项目的Settings.xml文件(位于项目根目录下的\ 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> 
  1. 在Service Fabric项目的ApplicationManifest.xml文件中,每个包含的项目都会有<ServiceManifestImport>元素。 下面是一个<ConfigOverrides>元素,我们将声明在我们的Service Fabric项目的ApplicationParameters下面的本地和云XML文件中为每个环境设置的值将取代我们configuration的值。 在同一个ApplicationManifest.xml文件中,您需要添加将存在于本地和云xml文件中的参数,否则在构build时它们将被覆盖。

继续上面的例子,这是如何设置的。

 <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> 
  1. 在您的Service Fabric项目的ApplicationParameters下的local.xml和cloud.xml文件中,您将指定特定于您的环境的variables,如下所示。
 <?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> 
  1. 最后,在你的服务/angular色你可以像这样访问这些每个环境的configurationvariables。
 var configurationPackage = Context.CodePackageActivationContext.GetConfigurationPackageObject("Config"); var connectionStringParameter = configurationPackage.Settings.Sections["UserDatabase"].Parameters["UserDatabaseConnectionString"]; 

您可以像使用任何其他应用程序一样使用环境variables ,这与服务结构中的guest可执行文件不同,与settings.xml不同,因为这需要内置的服务结构运行时。

在您的应用程序中,您可以像使用Environment类中的GetEnvironmentVariable方法一样访问任何其他.net应用程序的环境variables:

 var baseUri = Environment.GetEnvironmentVariable("SuperWebServiceBaseUri"); 

然后我们需要设置一些默认的环境variables值,这是在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> 

这些环境variables可以通过使用以下代码在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.xmlcloud.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> 

上面的答案很好地解释了它是如何完成的。 我想补充一句,为什么这是“ 错综复杂的 ”:

它必须是这样的,因为这些服务是自成体系的。 他们应该默认运行在任何应用程序链接到。 独立于应用程序的清单。 所以服务只能依靠参数,这些参数至less是在自己的configuration中预定义的。

这些预设可以被应用程序覆盖。 这是唯一的通用方法。

Interesting Posts