Autofac不将相同的实例传递给构造函数中已解析的参数

时间:2010-07-27 14:36:51

标签: autofac

我有以下设置

public class CommonClass : ICommonClass
{
}

public class SomeClass : ISomeClass
{
   public SomeClass(ICommonClass common, IOtherClass otherClass) {}
}

public class OtherClass : IOtherClass
{
  public OtherClass(ICommonClass common) {}
}

//Registration
builder.RegisterType<CommonClass>().As<ICommonClass>().InstancePerDependency();
builder.RegisterType<SomeClass>().As<ISomeClass>().InstancePerDependency();
builder.RegisterType<OtherClass>().As<IOtherClass>().InstancePerDependency();

我希望每个构造函数中的公共参数是同一个实例,但是当它解析SomeClass时它会创建新的ICommon实例。我怎么能得到这个时间。我试图将它们注册为InstancePerLifetimeScope,但它的行为与SingleInstance相同。

2 个答案:

答案 0 :(得分:0)

InstancePerDependency是您需要每个依赖项的新实例的方法。现在为不同的依赖类改变生命周期是棘手的,并且感觉不对。如果你能详细说明为什么你需要这种行为,也许可以找到更好的方法。

那就是说,要完成你所要求的(虽然我不喜欢它;),你可以使用“实例持有者”。我的想法是,对于常规依赖,新常见实例将照常提供。但是对于特殊情况SomeClass,公共实例是从这个始终为同一个实例提供服务的holder类中提取的:

public class CommonHolder
{
    public ICommonClass Instance {get;private set;}
    public CommonHolder(ICommonClass commonInstance)
    {
        Instance = commonInstance;
    }
}

然后注册设置:

builder.RegisterType<CommonHolder>().SingleInstance();
builder.RegisterType<OtherClass>().As<IOtherClass>().InstancePerDependency();
builder.RegisterType<CommonClass>().As<ICommonClass>().InstancePerDependency();

builder.RegisterType<SomeClass>().InstancePerDependency();
builder.Register(c =>
    c.Resolve<SomeClass>(TypedParameter.From(c.Resolve<CommonHolder>().Instance)))
    .As<ISomeClass>().InstancePerDependency();

答案 1 :(得分:0)

您可以创建ICommonClass的单独命名注册,并仅在解析SomeClass时使用该注册:

// Existing registration
builder.RegisterType<CommonClass>().As<ICommonClass>().InstancePerDependency();

// One-off registration
builder
    .RegisterType<CommonClass>()
    .As<ICommonClass>()
    .InstancePerLifetimeScope()
    .Named<ICommonClass>("OneOffCommonClass");

// New registrations of dependents
builder.RegisterType<OtherClass>().As<IOtherClass>().InstancePerDependency();

builder
    .Register(c => new SomeClass(
        c.Resolve<ICommonClass>("OneOffCommonClass"),
        c.Resolve<IOtherClass>()))
    .As<ISomeClass>()
    .InstancePerDependency();