抽象工厂类不会破坏IoC容器的生命周期管理吗?

本文关键字:生命 周期 管理 IoC 工厂 抽象 | 更新日期: 2023-09-27 18:16:53

public class MyClassFactory : IMyClassFactory
{ 
    private readonly IMySingleton _mySingleton;
    private readonly IMyNonSingleton _myNonSingleton;
    public MyClassFactory(
        IMySingleton mySingleton, 
        IMyNonSingleton myNonSingleton
        )
    {
        _mySingleton = mySingleton;
        _myNonSingleton = myNonSingleton;
    }
    public IMyResult CreateMyResult(int resultId)
    {
        // right here - have i not arbitrarily extended the lifespan
        //              of _myNonSingleton?  
        //
        return new MyResult(_mySingleton, _myNonSingleton, resultId);
    }
} 

通过这种设置,每个新的MyResult将获得相同的IMyNonSingleton实例。解决这个问题的唯一方法不是在每次创建MyResult时再次在容器上调用Resolve吗?

同样,如果我这样做了,那不是开始看起来像一个服务定位器模式吗?至少,我将违反"不要调用容器,它会调用你"answers"你只调用Resolve一次"之类的规则,对吗?

编辑:这里的想法是,IMySingleton已经注册在我的容器作为一个单例和其他类没有。

抽象工厂类不会破坏IoC容器的生命周期管理吗?

您有可能在无意中延长对象的生命周期,但它适用于一个对象的生命周期与其他对象的生命周期不匹配的所有情况。

不存在问题的情况:

  • 你可以在每次需要工厂时向容器请求工厂,或者工厂的生命周期与工厂使用的对象的最短生命周期相匹配。
  • 你实际上需要对象有更长的生命周期(或匹配工厂)
  • 寿命短的对象不关心

可能出现问题的情况:

  • 你的工厂有更长的生命周期(即应用程序),但是对象必须每次都创建,或者在IOC容器管理的其他频率创建。

解决方案:

  • 将工厂与容器集成(即将容器传递给工厂并使用其resolve方法构造内部对象)
  • 传递"creator"方法而不是实例到构造函数中,以避免直接依赖容器。
  • 完全放弃工厂,直接集成到容器初始化中。

。Microsoft Unity容器注册了type和Func<T>,因此您的工厂可以立即依赖于创建者函数,如:

 public MyClassFactory(
    Func<IMySingleton> mySingleton, 
    Func<IMyNonSingleton> myNonSingleton
    )...

1)我认为你可以改变接口的IMyClassFactory

public interface IMyClassFactory
{
    IMyResult CreateMyResult(int resultId, IMyNonSingleton myNonSinglrton);
}

2)或者你需要一个IMyNonSingletonFactory来重写像这样的代码

public class MyClassFactory : IMyClassFactory
{ 
    private readonly IMySingleton _mySingleton;
    private readonly IMyNonSingletonFactory _myNonSingletonFactory;
    public MyClassFactory(
        IMySingleton mySingleton, 
        IMyNonSingletonFactory myNonSingletonFactory
    )
    {
        _mySingleton = mySingleton;
        _myNonSingletonFactory = myNonSingletonFactory;
    }
    public IMyResult CreateMyResult(int resultId)
    {
        //you need your definition of INonSingletonFactory
        return new MyResult(_mySingleton, _myNonSingletonFactory.Create(), resultId);
    }
}