Autofac délégué de l'usine à l'aide de la touche func<>
J'essaie de comprendre le délégué de l'usine modèle avec Autofac. Je sais comment le mettre en œuvre en usine à l'aide de IIndex<> avec Détrompeur() de l'enregistrement, qui est bien expliqué ici: La configuration d'un Autofac délégué de l'usine qui est définie sur une classe abstraite
Je voudrais savoir si je peux créer une usine à l'aide de la touche Func<>, et comment faire les inscriptions pour l'exemple suivant:
public enum Service
{
Foo,
Bar
}
public interface FooService : IService
{
ServiceMethod();
}
public interface BarService : IService
{
ServiceMethod();
}
public class FooBarClient
{
private readonly IService service;
public FooBarClient(Func<Service, IService> service)
{
this.service = service(Service.Foo);
}
public void Process()
{
service.ServiceMethod(); //call the foo service.
}
}
Pourquoi ne pas simplement utiliser
Pour IIndex<> je vais avoir besoin de faire référence à l'Autofac bibliothèque que j'essaie d'éviter. Je veux que mon DI de code en Composite racine (bibliothèque séparée) seulement si cela est possible.
IIndex<>
avec Keyed()
? Autofac ne peut pas créer ce Func<Service, IService>
pour vous. Vous devez l'enregistrer dans votre récipient avec l'aide de Keyed()
ou Named()
quelque chose comme: builder.Register<Func<Service, IService>>(c => s => c.ResolveKeyed<IService>(s));
Délégué usines ne pouvez créer qu'un seul type de paramètres et de ne pas choisir un type de paramètre car c'est ce qui est IIndex<>
pour.Pour IIndex<> je vais avoir besoin de faire référence à l'Autofac bibliothèque que j'essaie d'éviter. Je veux que mon DI de code en Composite racine (bibliothèque séparée) seulement si cela est possible.
OriginalL'auteur Narayan Akhade | 2013-03-14
Vous devez vous connecter pour publier un commentaire.
Autofac ne peut pas construire ce
Func<Service, IService>
pour vous, qui vous permet de rétablir les différents types en fonction d'un paramètre. C'est ce queIIndex<>
est pour.Toutefois, si vous ne voulez pas/ne peut pas utiliser
IIndex<>
vous pouvez créer cette usine de fonctionner avec l'aide de laKeyed
ouNamed
et enregistrer votre usine dans le conteneur:Je ne sais pas comment IIndex est mis en place et quel genre de chaching ou l'optimisation de la performance. Vous pouvez vérifier l'implantation ou vous avez besoin de faire des tests de performance adaptés à votre scénario de comparer les deux.
J'ai juste essayé avec la raison, mais il me donne une
ObjectDisposedException
... j'ai "résolu" cela en appelantnew Foo
à l'intérieur de la délégué (qui est un grooos nogo!)l'usine d'inscription dans la réponse a une question qui est allé précédemment décoché dans autofac. Puisque nous ne pouvons pas "capturer" le contexte initial, vous devez vous enregistrer un supplément de résoudre le contexte de la sorte:
builder.Register<Func<Service, IService>>(c => { var context = c.Resolve<IComponentContext>(); return (s) => {return context.ResolveKeyed<IService>(s); };});
OriginalL'auteur nemesv