8
votes

Motif composite Autofac

J'ai remarqué que j'ai souvent besoin de mettre en œuvre un motif composite. Par exemple:

builder.RegisterType<Service1>().Named<IService>("impl");
builder.RegisterType<Service2>().Named<IService>("impl");

builder.Register(c => new CompositeService(c.Resolve<IEnumerable<IService>>("impl")))
    .As<IService>();


0 commentaires

3 Réponses :


1
votes

Vous pouvez essayer des inscriptions nommées ou identifiées. Une inscription nommée obtient simplement un nom de chaîne, de la différencier des autres enregistrements de la même interface. De même, une clé utilise un type de valeur, par exemple une énumération, de discriminer entre plusieurs enregistrements. Votre compositeservice serait probablement la référence par défaut, enregistrée par type sans autre information spéciale requise. Vous aurez besoin d'une méthode pour résoudre les autres dépendances d'iservice et les transmettre au constructeur; Une méthode d'usine pour compositesvice peut fonctionner.


1 commentaires

Merci! Je fais actuellement exactement ce que vous avez décrit. J'espérais un code plus intelligent et plus court.



4
votes

Je n'ai pas mis en œuvre cela ou même le pensé complètement, mais la meilleure syntaxe que je pouvais obtenir est la suivante:

builder
.RegisterComposite<IService>((c, elements) => new CompositeService(elements))
.WithElementsNamed("impl");


2 commentaires

Je proposerais également une version plus simple pour des cas simples: Builder.registercostiteType ("Implex") . Je n'aime tout simplement pas appeler le constructeur manuellement car les dépendances peuvent déjà être injectées.


@Konstantin Spirin: J'avais envisagé de mettre dans cette surcharge mais je voulais être explicite sur ce qui se passe dans ma réponse. La seule chose que je changerais, c'est que j'utiliserais toujours le avec des méthodes (et aussi avec des méthodes ), afin que nous n'aurions donc pas à créer des surcharges de registercomposite < / Code> Pour les différents types d'enregistrement (qui est quelque chose aucune des autres méthodes d'enregistrement ne le font pour les types nommés / identifiés).



1
votes

Enregistrement composite arrivera dans Autofac 6.0 .

Il ne créera pas automatiquement un composite pour vous, mais ce sera

  • injecter toutes les autres implémentations de l'interface dans le composite
  • enregistrer le composite comme implémentation d'interface par défaut
  • ne résout pas le composite dans iEnumerable résolutions.

0 commentaires