2017-06-28 1 views
0

Je suis en train de lire ma configuration de la configuration SF en utilisant le « ConfigurationPackage » qui est disponible à partir de tout contexte de SF. Ma classe ressemble à ceci:Injecter Servics Tissu ServiceContext dans les implémentations utilisant DI Config

internal class ServiceFabricDbConfiguration : IDbConnectionConfig 
{ 
    private ConfigurationPackage _configurationPackage; 

    public ServiceFabricDbConfiguration(ServiceContext context) 
    { 
     _configurationPackage = context.CodePackageActivationContext.GetConfigurationPackageObject("Config"); 
    } 

    public string UserName => 
     _configurationPackage.Settings.Sections["Db_Configuration"] 
      .Parameters[ 
       "Username"] 
      .Value; 
} 

J'utilise autofac comme mon conteneur DI, et peut enregistrer la classe ci-dessus en capturant explicitement une référence au ServiceContext quand je l'enregistrer avec le moteur d'exécution SF:

ServiceRuntime.RegisterServiceAsync("ApiType", 
         context => 
         { 
          Bootstrapper.SetContext(context); 
          return new Api(context); 
         }) 
        .GetAwaiter() 
        .GetResult(); 

Est-il possible que je puisse enregistrer le ServiceContext avec le programme d'amorçage, idéalement dans la classe bootstrapper?

J'expérimente actuellement avec l'aide Autofac.ServiceFabric pour enregistrer mes acteurs/services, mais qui cache le rend si ServiceContext ci-dessus plus difficile à réaliser à nouveau (mais ne le rendre beaucoup plus facile de maintenir les définitions du module autofac propres)

+0

Je ne sais pas ce que votre classe est Bootstrapper, mais peu importe .. Il y a la méthode statique 'GetActivationContext()' 'dans FabricRuntime'. Ne pouvez-vous pas exploiter cela? – Mardoxx

+0

Je voudrais, si vous ne l'avez pas déjà fait, envisager sérieusement de regarder les extensions autofac de Service Fabric. C'est im bêta pour le moment mais je l'ai utilisé sans problème. https://github.com/autofac/Autofac.ServiceFabric – Mardoxx

+1

Ah - je ne l'avais pas remarqué FabricRuntime (avait utilisé FabricClient mais ServiceContext ne sont pas disponibles par ce) - des thats parfait, merci Mardoxx. Si vous ajoutez ceci comme réponse, je l'accepterai. Yup - Je change juste nos projets pour utiliser Autofac.ServiceFabric, mais je ne pense pas qu'ils aient une extension de construction pour cela? [Excuses - Bootstrapper est la classe avec les enregistrements autofac] –

Répondre

1

Il y a la méthode statique GetActivationContext() dans FabricRuntime. Vous pourriez peut-être utiliser ceci pour injecter le contexte d'activation.

Il y a aussi, dans le développement, Autofac.ServiceFabric https://github.com/autofac/Autofac.ServiceFabric qui peut être utile pour vous. Il ya un billet de blog à ce sujet ici https://alexmg.com/introducing-the-autofac-integration-for-service-fabric/ qui contient également des liens vers l'exemple de code! C'est en pré-version (beta) pour le moment mais je l'utilise depuis quelques mois sans problème.

1

PR 8 rend le ServiceContext disponible dans Autofac.ServiceFabric