1

我刚刚开始使用 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),但前两种只采用常量值。似乎已解决的参数是要走的路,但是我对如何实现它或者这是否是正确的策略有点迷茫。builder.Register 会是什么样子?

4

2 回答 2

0

您不仅可以在注册时传递附加参数,还可以在解析类型时传递。

ResolvedParameter仅当您已IUserInformationProvider在容器中注册时才能使用,因此它可能不适用于您的情况。

但是,您可以NamedParameter在需要传递在 contrustor 中使用的参数名称"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 集成的一般指南,您可以从文档开始

于 2013-07-24T05:01:46.227 回答
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;
于 2013-07-24T07:40:55.800 回答