Para dos entornos, local y en la nube, ¿cómo configuraría configuraciones o parámetros personalizados para recursos como bases de datos SQL, cuentas de almacenamiento, etc.? Idealmente, sería un nombre de parámetro llamado en el código para decir, apuntar un DbContext hacia un particular base de datos, que en configuraciones para un entorno local o en la nube sea diferente. Gracias.
azure
azure-sql-database
azure-service-fabric
StampyTurtle
fuente
fuente
Respuestas:
Para tener por variables de entorno para ejecutar Service Fabric localmente y en la nube, esto es lo que debe hacer:
<?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>
elementos para cada uno de sus proyectos incluidos. Debajo habrá un<ConfigOverrides>
elemento donde declararemos qué valores para nuestras configuraciones serán suplantados por los valores establecidos por entorno en los archivos xml local y en la nube debajo de ApplicationParameters en nuestro proyecto de Service Fabric. En ese mismo archivo ApplicationManifest.xml, deberá agregar el parámetro que estará presente en los archivos xml local y en la nube; de lo contrario, se sobrescribirán en la compilación.Continuando con el ejemplo anterior, así se configuraría.
<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"];
fuente
ServiceManifestImport
(hijo deApplicationManifest
) peroConfigOverrides
tienes que ir en él (hijo deServiceManifestImport
).Puede usar variables de entorno como cualquier otra aplicación, esto también funciona con el ejecutable invitado dentro de la estructura de servicio, a diferencia de
settings.xml
esto, ya que requiere el tiempo de ejecución de la estructura de servicio integrado.Dentro de su aplicación, puede acceder a las variables de entorno como cualquier otra aplicación .net a través del
GetEnvironmentVariable
método de laEnvironment
clase:var baseUri = Environment.GetEnvironmentVariable("SuperWebServiceBaseUri");
Luego, necesitamos configurar algunos valores de variables de entorno predeterminados, esto se hace dentro del
ServiceManifest.xml
archivo de manifiesto del servicio.<?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>
Luego, estas variables de entorno se pueden anular dentro del
ApplicationManifest.xml
archivo mediante el siguiente código:<?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>
Esto luego se puede parametrizar como cualquier otra configuración de manifiesto de aplicación utilizando
local.xml
ycloud.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>
Entonces tendremos que actualizar el
ApplicationManifest.xml
para admitir estos parámetros;<?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>
fuente
Las respuestas anteriores explican bien cómo se hace. Quiero agregar una marca lateral, por qué es tan ' complicado ':
Tiene que ser así, ya que los servicios están destinados a ser autónomos. Deben ejecutarse de forma predeterminada en cualquier aplicación a la que estén vinculados. Independiente del Manifiesto de la aplicación. Por lo tanto, el servicio solo puede depender de parámetros, que al menos están predefinidos en su propia configuración.
La aplicación puede sobrescribir estos ajustes predeterminados. Este es el único enfoque universal.
fuente