我正在尝试将Autofac集成到现有的ASP.NET Web应用程序中。
页面遵循MVP模式。每个页面都为Presenter实现了View和delegate功能。 View通过构造函数注入Presenter。
我能够注册Presenter和View并且页面加载正常,但是当回发发生时,视图上的用户控件为null。似乎Autofac创建了一个新的Page实例,以便为演示者提供实例真实的Page实例。有没有办法让Page实例在Autofac中注册?
有人在ASP.NET和MVP中使用Autofac吗?
谢谢!
答案 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; }
我不确定是否有更好的方法,但这似乎有效。