2017-03-31 1 views
2

J'essaie d'utiliser un décorateur dans Autofac avec une usine de délégué mais je n'arrive pas à l'obtenir pour résoudre les paramètres.Autofac décorateur + délégué usine

public interface IFoo 
{ } 

public class Foo : IFoo 
{ 
    public Foo(string bar) 
    { ... } 
} 

public class DecoratedFoo : IFoo 
{ 
    public DecoratedFoo(IFoo decorated) 
    { ... } 
} 

Je voudrais injecter dans un service comme si:

public SomeService(Func<string, IFoo> factory) 
{ 
    // I would expect IFoo to be a DecoratedFoo here 
    IFoo foo = factory("hello"); 
} 

Je composants enregistrés comme ceci:

builder.RegisterType<Foo>() 
    .Named<IFoo>("foo") 
    .UsingConstructor(typeof(string)); 

builder.RegisterDecorator<IFoo>(
    (ctx, inner) => new DecoratedFoo(inner), 
    fromKey: "foo"); 

Je reçois une erreur disant qu'il ne peut pas résoudre mon barre de paramètres . Ceci est un exemple simplifié mais je ne saurai pas quelle est la valeur de la barre (d'où l'utilisation de l'usine).

Y at-il un moyen d'accomplir ce que je fais?

Répondre

1

Lorsque vous utilisez RegisterDecorator - il ne propagera pas le paramètre de chaîne que vous transmettez à votre usine plus profond à votre constructeur Foo. Voici un issue ouvert à ce sujet. Donc, sur cette ligne

IFoo foo = factory("hello"); 

Il lancera exception (comme vous observez) car il va essayer de trouver un constructeur de Foo et parameterless n'y en a pas.

Pour fixer, vous pouvez retirer votre RegisterDecorator et au lieu faire manuellement:

builder.RegisterType<Foo>() 
    .Named<IFoo>("foo");    
builder.Register((cnt, parameters) => 
    new DecoratedFoo(cnt.ResolveNamed<IFoo>("foo", parameters))).As<IFoo>(); 

Presque la même quantité de code, mais fonctionne comme prévu, parce que vous propagez manuellement les paramètres.

+0

Merci de m'avoir indiqué le numéro ouvert. – Dismissile