2017-03-31 49 views
2

我想在委託工廠中使用Autofac中的裝飾器,但我似乎無法得到它來解決參數。Autofac修飾器+代理工廠

public interface IFoo 
{ } 

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

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

我想注入一個服務,像這樣:

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

我已經註冊的組件,像這樣:

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

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

我得到一個錯誤說,它不能化解我的參數吧。這是一個簡化的例子,但我不知道bar的值是什麼(因此使用工廠)。

有什麼方法可以完成我在做的事情嗎?

回答

1

當您使用RegisterDecorator時 - 它不會傳播字符串參數,您傳遞給您的工廠更深入您的Foo構造函數。關於這一點,這是一個開放的issue。所以,在這條線

IFoo foo = factory("hello"); 

它會拋出異常(如你觀察),因爲它會嘗試找到Foo參數的構造函數再沒有。

要解決,你可以刪除你的RegisterDecorator,而是說做手工:

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

幾乎相同的代碼量,但按預期工作,因爲你手動傳播參數。

+0

謝謝你指點我的問題。 – Dismissile