Autofac和WebForms - 传递非常量参数,解析参数?

时间:2013-07-22 03:41:29

标签: c# .net dependency-injection webforms autofac

我刚刚开始使用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会是什么样子?

2 个答案:

答案 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;