Autofac Webform集成:手动属性注入

时间:2011-09-28 14:36:51

标签: dependency-injection autofac

考虑这个autofac注册模块用于webform MVP样式应用程序,其中我通过提供一些参数依赖性来注册几个组件。

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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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