如何将一个组件的相同实例注入到其他几个组件中



使用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

如果你的SecondaryClassMainClass不在乎他们是否使用相同的Report,而你只是希望让他们共享它,你可以按照@adrift的建议使用单独的生命周期范围。但请注意,如果您使用依赖于 Report 的其他组件,它们也将在该生命周期范围内获得相同的实例。它将是示波器内的单例。

如果您的组件确实依赖于使用相同的实例,我不会使用生命周期范围重新评论。如果你这样做了,要求将被混淆,这是不好的。

如果在生存期内解析MainType,则相同的Report实例将同时用于MainClassSecondaryClass

因此,在您的工厂方法中,您可以执行以下操作:

using (var lifetime = container.BeginLifetimeScope())
{
    return container.Resolve<MainClass>();
}

最新更新