考慮一個webform MVP樣式應用程序的autofac註冊模塊,其中我通過提供一些參數依賴項來註冊幾個組件。Autofac Webform集成:手動屬性注入
public class SampleModule : Module
{
protected override void Load(ContainerBuilder builder)
{
builder.RegisterType<FooService>().As<IFooService>();
builder.Register<FooPresenter>((c, p) =>
new FooPresenter(p.Named<IFooView>("view"),
c.Resolve<IFooService>(p),
p.Named<string>("connectionString")))
.InstancePerHttpRequest();
base.Load(builder);
}
}
在頁面上,我可以使用像這樣的代碼解析類型:
protected override void OnPreInit(EventArgs e)
{
base.OnPreInit(e);
var cpa = (IContainerProviderAccessor) HttpContext.Current.ApplicationInstance;
var cp = cpa.ContainerProvider;
// Resolve presenter
var presenter = cp.RequestLifetime.Resolve<FooPresenter>(
new NamedParameter[]
{
new NamedParameter("connectionString", "xyz"),
new NamedParameter("view", this)
});
}
但我真的想使用屬性注入和管理上處於該級別的參數的依賴;這樣的例如:
public FooPresenter Presenter { get; set; }
protected override void OnPreInit(EventArgs e)
{
base.OnPreInit(e);
var cpa = (IContainerProviderAccessor) HttpContext.Current.ApplicationInstance;
var cp = cpa.ContainerProvider;
// Parameters bindings?
cp.RequestLifetime.InjectProperties(this);
}
有什麼,我可以利用Autofac?提前致謝。
對不起,不是我的問題太清楚。我在這裏試圖解決的問題是如何在使用autofac的屬性注入功能時綁定命名參數。 – Fab60
感謝Bryan,我感謝您爲演示者/視圖鏈接提供的聰明解決方案。你是對的,連接參數實際上是演示者的虛假依賴(應用程序的傳統部分將其存儲在應用程序對象中)。無論如何,我認爲在Autofac中有一種方法來綁定屬性注入場景中的參數應該是有益的;就像Resolve方法實際上通過在其重載上使用IEnumerable一樣。 –
Fab60
我明白。由於ASP.NET創建頁面實例,因此無法使用像OnActivating這樣的生命週期事件。在某些時候,您需要直接引用容器,就像您在'OnPreInit'中完成的那樣;如果你想使用參數,你必須自己解析和設置屬性,而不是依賴'InjectProperties',即'Presenter = cp.RequestLifetime.Resolve(...參數...);' –