1

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

这些页面遵循 MVP 模式。每个页面都实现一个 View 并将功能委托给 Presenter。View 通过构造函数注入到 Presenter 中。

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

有没有人将 Autofac 与 ASP.NET 和 MVP 一起使用?

谢谢!

4

2 回答 2

2

有个更好的方法。首先,启用Web 集成模块。这将启用自动属性注入到Page实例中。

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

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

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>();
于 2009-12-02T22:55:07.127 回答
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; }

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

于 2009-01-12T19:17:01.840 回答