使用Autofac,我有以下情况:
public class MainClass
{
public delegate MainClass Factory();
public MainClass(Report report, SecondaryClass secClass)
{
Report=report;
SecondaryClass = secClass;
}
public Report Report {get; private set;}
public SecondaryClass SecondaryClass {get; private set;}
}
public class SecondaryClass
{
public SecondaryClass(Report report)
{
Report=report;
}
public Report Report {get; private set;}
}
我想要实现的是,每次我在 MainClass 上调用 Factory(( 委托时,MainClass 和 SecondaryClass 都会注入相同的 Report 实例。
基本上
public void MyMethod()
{
var myMainClass = _MainClassFactory.Invoke();
//How do I do achieve this????
Debug.Assert (object.ReferenceEquals(myMainClass.Report , myMainClass.SecondaryClass.Report));
}
如何配置主类和辅助类?我目前的配置如下,但它似乎没有达到我想要的。事实上,每次调用工厂方法时,我都会得到相同的 Report 实例。
builder.RegisterType<MainClass>().AsSelf();
builder.RegisterType<SecondaryClass>().AsSelf();
builder.RegisterType<Report>().AsSelf().InstancePerLifetimeScope();
像往常一样,这取决于。
如果你想表达这样一个事实,即MainClass
故意需要与SecondaryClass
使用的实例相同的Report
实例,那么你应该按照@adrift在注释中的建议从SecondaryClass
中获取Report
,或者使用参数化:
public class MainClass
{
public delegate MainClass Factory();
public MainClass(Report report, Func<Report, SecondaryClass> secClassFactory)
{
Report=report;
SecondaryClass = secClassFactory(report);
}
public Report Report {get; private set;}
public SecondaryClass SecondaryClass {get; private set;}
}
public class SecondaryClass
{
public SecondaryClass(Report report)
{
Report=report;
}
public Report Report {get; private set;}
}
(参见Autofac Wiki以供参考(使用这些方法,您可以直接表明您需要两个对象使用相同的Report
。
如果你的SecondaryClass
和MainClass
不在乎他们是否使用相同的Report
,而你只是希望让他们共享它,你可以按照@adrift的建议使用单独的生命周期范围。但请注意,如果您使用依赖于 Report
的其他组件,它们也将在该生命周期范围内获得相同的实例。它将是示波器内的单例。
如果您的组件确实依赖于使用相同的实例,我不会使用生命周期范围重新评论。如果你这样做了,要求将被混淆,这是不好的。
如果在生存期内解析MainType
,则相同的Report
实例将同时用于MainClass
和SecondaryClass
。
因此,在您的工厂方法中,您可以执行以下操作:
using (var lifetime = container.BeginLifetimeScope())
{
return container.Resolve<MainClass>();
}