2011-09-28 52 views
2

考慮一個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?提前致謝。

回答

2

是的,有ASP.NET集成,它將注入頁面級屬性。

請參見 「添加模塊到Web.config中」 一節在這裏:

http://code.google.com/p/autofac/wiki/AspNetIntegration

編輯:對不起,誤解的問題。我現在看到,你並不是問屬性注入是否可用,而是如何將它與命名參數結合使用。

我要做一個推論,並說出你需要命名參數的原因僅僅是爲了將視圖傳遞給演示者。連接字符串不應該是頁面的責任;你可以在SampleModule上創建一個屬性並從那裏閱讀。

我有一個首選的方法來MVP/Autofac已經過多年的戰鬥測試。它很乾淨,提供了一些不錯的擴展點,並且保持頁面相對沒有實現細節。你可以在我的答案概述了這個問題:

Injecting Lower Layer Dependency in Presenter in an ASP.NET MVP Application

+0

對不起,不是我的問題太清楚。我在這裏試圖解決的問題是如何在使用autofac的屬性注入功能時綁定命名參數。 – Fab60

+0

感謝Bryan,我感謝您爲演示者/視圖鏈接提供的聰明解決方案。你是對的,連接參數實際上是演示者的虛假依賴(應用程序的傳統部分將其存儲在應用程序對象中)。無論如何,我認爲在Autofac中有一種方法來綁定屬性注入場景中的參數應該是有益的;就像Resolve方法實際上通過在其重載上使用IEnumerable 一樣。 – Fab60

+0

我明白。由於ASP.NET創建頁面實例,因此無法使用像OnActivating這樣的生命週期事件。在某些時候,您需要直接引用容器,就像您在'OnPreInit'中完成的那樣;如果你想使用參數,你必須自己解析和設置屬性,而不是依賴'InjectProperties',即'Presenter = cp.RequestLifetime.Resolve (...參數...);' –

0

這工作,是在自動Autofac

<Autofac.Integration.Web.Forms.InjectUnsetProperties()> 
Public MustInherit Class ViewBasePage(Of TPresenter As BasePresenter(Of TView, TPresenter), TView As {IView, Class}) 
    Inherits System.Web.UI.Page 
    Implements IView 

Protected _presenter As TPresenter 
Private _factory As Func(Of TView, TPresenter) 

Public Property PresenterFactory As Func(Of TView, TPresenter) 
    Get 
     Return _factory 
    End Get 
    Set(value As Func(Of TView, TPresenter) 
     _factory = value 

     _presenter = _factory(DirectCast(DirectCast(Me, IView), TView)) 
    End Set 
End Property