使用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));
}
如何配置MainClass和SecondaryClass? 我目前的配置如下,但它似乎没有实现我想要的。 事实上,每次调用Factory方法时,都会得到相同的Report实例。
builder.RegisterType<MainClass>().AsSelf();
builder.RegisterType<SecondaryClass>().AsSelf();
builder.RegisterType<Report>().AsSelf().InstancePerLifetimeScope();
答案 0 :(得分:1)
如果您在生命周期范围内解析MainType
,则同一Report
个实例将用于MainClass
和SecondaryClass
。
因此,在您的工厂方法中,您可以执行以下操作:
using (var lifetime = container.BeginLifetimeScope())
{
return container.Resolve<MainClass>();
}
答案 1 :(得分:1)
像往常一样,这取决于。
如果您想表达MainClass
故意要求与Report
的实例使用相同的SecondaryClass
实例的事实,那么您应该从Report
获取SecondaryClass
@adrift在评论中建议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;}
}
,或使用参数化:
Report
(see autofac wiki for reference)
使用这些方法,您可以直接显示需要两个对象使用相同的SecondaryClass
。
如果您的MainClass
和Report
不在乎他们是否使用相同的Report
,并且只是希望让他们共享它,那么您可以使用单独的生命周期范围作为@ adrift建议。但请注意,如果您使用依赖于{{1}}的其他组件,它们也将在该生命周期范围内获得相同的实例。它将成为范围内的单身人士。
如果您的组件依赖于使用相同的实例,我不建议使用生命周期范围。如果你这样做了,那么这个要求会被混淆,这是不好的。