我刚刚开始使用Autofac,我有以下代码:
public class _default : System.Web.UI.Page, IUserInformationProvider
{
protected void Page_Load(object sender, System.EventArgs e)
{
ControllerFactory cf;
using (scope == ((Global_asax)this.Context.ApplicationInstance).ContainerProvider.ApplicationContainer.BeginLifetimeScope()) {
cf = scope.Resolve<IControllerFactory>(); // <-- would love to pass "this" somewhere here, but how???
}
}
}
ControllerFactory定义如下,并且还采用IUserInformationProvider接口。我想将WebForm的实例作为参数传递给Resolve IControllerFactory。
public class ControllerFactory : IControllerFactory
{
protected IUserInformationProvider _userInformation;
public ControllerFactory(IUserInformationProvider userInformation)
{
_userInformation = userInformation;
}
}
查看文档,我看到有3种参数类型(Named,Typed,Resolved),但前2只采用常量值。似乎Resolved参数是要走的路,但我对如何实现它有点迷茫,或者这甚至是正确的策略。那个builder.Register会是什么样子?
答案 0 :(得分:0)
您不仅可以在注册时传递其他参数,还可以在解析类型时传递其他参数。
ResolvedParameter
只能在您的IUserInformationProvider
已在容器中注册的情况下使用,因此在您的情况下可能无效。
但是,您可以使用NamedParameter
来传递您在控制器中使用的参数名称"userInformation"
和值this
:
cf = scope.Resolve<IControllerFactory>(
new NamedParameter("userInformation", this));
或者您可以使用TypedParameter
在这种情况下typeof(IUserInformationProvider)
再次传递参数类型的地方this
:
cf = scope.Resolve<IControllerFactory>(
new TypedParameter(typeof(IUserInformationProvider), this));
如果您正在寻找有关如何将WebForms与Autofac集成的一般指南,您可以从documentation
开始答案 1 :(得分:0)
通过在控制器中引入属性依赖关系来中断依赖关系循环:
public class ControllerFactory : IControllerFactory
{
public ControllerFactory() { }
// Property dependency (part of IControllerFactory interface)
public IUserInformationProvider UserInformation { get; set; }
}
这样您可以在Autofac构造该类型后设置值:
var factory = scope.Resolve<IControllerFactory>();
factory.UserInformation = this;
cf = factory;