我正在使用Autofac構造函數注入。我需要弄清楚如何將一個對象實例注入到多個構造函數參數中,而無需在容器設置階段顯式解析每個參數。如何使用Autofac注入同一對象的兩個實例?
我有一個複雜的場景,可以通過這種行爲來簡化;下面的例子只是一個簡化的場景,所以我可以證明我正在尋找的行爲。
例子:
說我有這兩個接口,IOpenable和ICloseable:
public interface IOpenable
{
void Open();
}
public interface ICloseable
{
void Close();
}
我有一個實現二者的這門類:
public interface IDoor : IOpenable, ICloseable { }
public class Door : IDoor, IOpenable, ICloseable
{
void Open() { ... }
void Close() { ... }
}
我有這個類,它接受一個IOpenable和ICloseable:
public class DoorHandler : IDoorHandler
{
public DoorHandler(IOpenable openable, ICloseable closeable)
{
...
}
...
}
問:
是否可以告訴autofac注入相同 Door對象到兩個參數,每當一個IOpenable和ICloseable是相同的構造函數的依賴?
注:我不能做:
container.Register<IDoorHandler>(c => {
Door d = c.Resolve<IDoor>();
return new DoorHandler(d,d)
});
這將做我想做的,但要記住,這DoorHandler類只是一個例子。在我的真實代碼中,「DoorHandler」實際上是一個MVC控制器,我正在使用RegisterControllers()註冊它。所以我不能像上面那樣註冊它。此外,有時候依賴關係圖可能會變得過於複雜,並且在任何情況下明確地執行此操作可能會變得非常困難。
我猜我尋找的是能夠做這樣的事情:
container.RegisterType<DoorHandler>().As<IDoorHandler>();
container.RegisterType<Door>().As<IDoor>();
container.Register<IOpenable>(c => c.ResolveShared<IDoor>(););
container.Register<ICloseable>(c => c.ResolveShared<IDoor>(););
哪裏調用c.ResolveShared<T>
將全部解決,以相同的T對象,如果要求在多個參數相同的構造函數。
或許:
container.RegisterType<DoorHandler>().As<IDoorHandler>();
container.RegisterType<Door>().As<IDoor>().InstancePerDependencyShared();
container.Register<IOpenable>(c => c.Resolve<IDoor>(););
container.Register<ICloseable>(c => c.Resolve<IDoor>(););
顯然,如果我用了Door對象的InstancePerLifetimeScope什麼的,每個解決門是相同的實例。但我不想這樣,每次創建一個DoorHandler時我都需要一個新的Door實例,並且我希望該Door作爲兩個參數傳遞給DoorHandler構造函數。
Autofac OOB就像你說的,不支持這一點。但是你的'DoorHandle'示例沒有說明*爲什麼*你需要像這樣解析一個類。如果我實現了'DoorHandle',我會讓它採用一個'IDoor'並且用它來完成:)也許如果你描述了真正的問題,我們可以更好地理解並且可能看到其他構造對象模型的方法? – 2011-03-24 22:20:10