使用Autofac与ASP.NET和MVP模式

时间:2009-01-11 05:44:28

标签: asp.net mvp autofac

我正在尝试将Autofac集成到现有的ASP.NET Web应用程序中。

页面遵循MVP模式。每个页面都为Presenter实现了View和delegate功能。 View通过构造函数注入Presenter。

我能够注册Presenter和View并且页面加载正常,但是当回发发生时,视图上的用户控件为null。似乎Autofac创建了一个新的Page实例,以便为演示者提供实例真实的Page实例。有没有办法让Page实例在Autofac中注册?

有人在ASP.NET和MVP中使用Autofac吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

有一种更好的方法。首先,启用the Web integration module。这将启用自动属性注入页面实例。

由于您的演示者需要在其构造函数中使用该视图,因此您的页面应依赖于演示者 factory 而不是演示者本身。

因此,首先需要演示者工厂,它是具有必要参数的委托:

public delegate IOCTestPresenter IOCTestPresenterFactory(IIOCTestView view);

此委托必须与演示者构造函数的参数(类型和名称)匹配:

public class IOCTestPresenter
{
     public IOCTestPresenter(IIOCTestView view)
     {
     }
}

在您的视图中,添加一个接收工厂委托的属性,并使用委托创建演示者:

public partial class IOCTest
{
     public IOCTestPresenterFactory PresenterFactory {get;set;}

     protected void Page_Load(object sender, EventArgs e)    
     {
           var presenter = PresenterFactory(this);
     }
}

在您的容器设置中,您必须进行以下注册:

builder.Register<IOCTestPresenter>().FactoryScoped();
builder.RegisterGeneratedFactory<IOCTestPresenterFactory>();

答案 1 :(得分:0)

我找到了解决方案。基本上,您将在Page_PreInit事件期间注册页面实例,然后调用容器以注入依赖项。实施例

public partial class IOCTest : System.Web.UI.Page, IIOCTestView
{

    protected void Page_PreInit(object sender, EventArgs e)
    {
        var containerProviderAccessor = (IContainerProviderAccessor)HttpContext.Current.ApplicationInstance;
        var containerProvider = containerProviderAccessor.ContainerProvider;

        var builder = new ContainerBuilder();
        builder.Register(this).ExternallyOwned().As<IIOCTestView>();

        builder.Build(containerProvider.RequestContainer);

        containerProvider.RequestContainer.InjectProperties(this);
    }

    public IOCTestPresenter Presenter { get; set; }

我不确定是否有更好的方法,但这似乎有效。