我有一個演示,需要一個服務和視聽合同作爲其構造函數的參數:依賴注入演示
public FooPresenter : IFooPresenter {
private IFooView view;
private readonly IFooService service;
public FooPresenter(IFooView view, IFooService service) {
this.view = view;
this.service = service;
}
}
我解決我的Autofac服務:
private ContainerProvider BuildDependencies() {
var builder = new ContainerBuilder();
builder.Register<FooService>().As<IFooService>().FactoryScoped();
return new ContainerProvider(builder.Build());
}
在我的ASPX頁面(查看執行):
public partial class Foo : Page, IFooView {
private FooPresenter presenter;
public Foo() {
// this is straightforward but not really ideal
// (IoCResolve is a holder for how I hit the container in global.asax)
this.presenter = new FooPresenter(this, IoCResolve<IFooService>());
// I would rather have an interface IFooPresenter so I can do
this.presenter = IoCResolve<IFooPresenter>();
// this allows me to add more services as needed without having to
// come back and manually update this constructor call here
}
}
問題是FooPresenter的構造函數期望特定的Page,不是爲容器創建一個新的。
我可以提供一個視圖的特定實例,即當前頁面,僅用於此分辨率的容器?這是否有意義,或者我應該以另一種方式做到這一點?
優秀的解決方案。感謝您指出。直到現在我還沒有真正掌握生成的工廠。 – 2009-12-18 08:03:13
我正在研究如何在抽象層次上做到這一點。我當前的框架允許用'[Presenter(typeof(FooPresenter))]'修飾視圖(因此消除了樣板解析代碼)。對於生成的工廠,如果沒有更多的元數據,我不會知道需要解決哪個工廠類型。我可能會使用'builder.RegisterGeneratedFactory>();'在通過反射發現視圖類型的擴展方法'RegisterPresenter '後面。無論如何,謝謝你的靈感! –
2009-12-18 08:24:54
你也可以嘗試我的通用工廠示例(鏈接到我的示例中的文章)。您只需註冊一個可以動態構建任何演示者的通用工廠。應該甚至可以將它與Presenter屬性相耦合,以最小化樣板解析代碼和樣板容器設置:) – 2009-12-18 08:43:29