1

我有以下设置

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();

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

4

2 回答 2

0

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

也就是说,要完成您的要求(尽管我不喜欢它;),您可以使用“实例持有者”。我的想法是,对于常规依赖项,新的公共实例将照常提供。但是对于特殊情况SomeClass,公共实例是从这个持有者类中获取的,该持有者类总是服务于同一个实例:

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();
于 2010-07-27T20:02:03.080 回答
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();
于 2010-07-28T19:42:58.540 回答