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>();
3 Réponses :
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. P>
Merci! Je fais actuellement exactement ce que vous avez décrit. J'espérais un code plus intelligent et plus court.
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");
Je proposerais également une version plus simple pour des cas simples: Builder.registercostiteType
@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 code> (et aussi
avec des méthodes code>), 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).
Enregistrement composite arrivera dans Autofac 6.0 . P>
Il ne créera pas automatiquement un composite pour vous, mais ce sera p>
iEnumerable code> résolutions. LI>
ul>