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

时间:2011-12-09 18:53:50

标签: autofac

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

2 个答案:

答案 0 :(得分:1)

如果您在生命周期范围内解析MainType,则同一Report个实例将用于MainClassSecondaryClass

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

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

如果您的MainClassReport不在乎他们是否使用相同的Report,并且只是希望让他们共享它,那么您可以使用单独的生命周期范围作为@ adrift建议。但请注意,如果您使用依赖于{{1}}的其他组件,它们也将在该生命周期范围内获得相同的实例。它将成为范围内的单身人士。

如果您的组件依赖于使用相同的实例,我不建议使用生命周期范围。如果你这样做了,那么这个要求会被混淆,这是不好的。