我有以下设置
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相同。
答案 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();