C# 不';抽象工厂类破坏了IoC容器的生命周期管理 公共类MyClassFactory:IMyClassFactory { 私人只读IMySingleton_mySingleton; 私有只读IMyNonSingleton\u myNonSingleton; 公共MyClassFactory( 伊姆辛格尔顿·迈辛格尔顿, 伊米诺辛格尔顿·米诺辛格尔顿 ) { _迈辛格尔顿=迈辛格尔顿; _myNonSingleton=myNonSingleton; } 公共IMyResult CreateMyResult(int resultId) { //就在这里-我没有任意延长寿命吗 //米农·辛格尔顿的? // 返回新的MyResult(_mySingleton,_myNonSingleton,resultId); } }

C# 不';抽象工厂类破坏了IoC容器的生命周期管理 公共类MyClassFactory:IMyClassFactory { 私人只读IMySingleton_mySingleton; 私有只读IMyNonSingleton\u myNonSingleton; 公共MyClassFactory( 伊姆辛格尔顿·迈辛格尔顿, 伊米诺辛格尔顿·米诺辛格尔顿 ) { _迈辛格尔顿=迈辛格尔顿; _myNonSingleton=myNonSingleton; } 公共IMyResult CreateMyResult(int resultId) { //就在这里-我没有任意延长寿命吗 //米农·辛格尔顿的? // 返回新的MyResult(_mySingleton,_myNonSingleton,resultId); } },c#,dependency-injection,inversion-of-control,containers,C#,Dependency Injection,Inversion Of Control,Containers,通过此设置,每个新的MyResult都将获得相同的IMyNonSingleton实例。解决此问题的唯一方法不是每次创建MyResult时再次调用容器上的Resolve吗 同样,如果我这样做,那不是开始看起来像一个服务定位器模式吗?至少,我会违反诸如“不要调用容器,它会调用您”和“您只调用一次Resolve”之类的规则,对吗 编辑:这里的想法是IMySingleton已经在我的容器中注册为singleton,而其他类没有注册。您可能会无意中延长对象的生存期,但它适用于一个对象的生存期与另一个对象的

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

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

编辑:这里的想法是IMySingleton已经在我的容器中注册为singleton,而其他类没有注册。

您可能会无意中延长对象的生存期,但它适用于一个对象的生存期与另一个对象的生存期不匹配的所有情况

可能不成问题的情况:

  • 您可能会在每次需要一个或多个工厂的生存期与工厂使用的对象的最短生存期相匹配时请求工厂的容器
  • 实际上,您需要对象具有更长的生命周期(或与工厂匹配)
  • 生命周期较短的对象不在乎
可能出现问题的情况:

  • 您的工厂具有更长的生命周期(即应用程序),但必须每次或以IOC容器管理的其他频率创建对象
解决办法:

  • 将工厂与容器集成(即将容器传递给工厂,并使用其解析方法构造内部对象)
  • 将“creator”方法而不是实例传递到构造函数中,以避免对容器的直接依赖
  • 完全放弃工厂,并将其直接集成到容器初始化中
也就是说,Microsoft Unity container同时注册type和
Func
,因此您的工厂可以立即依赖creator函数,如:

 public MyClassFactory(
    Func<IMySingleton> mySingleton, 
    Func<IMyNonSingleton> myNonSingleton
    )...
公共MyClassFactory(
Func mySingleton,
Func-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);
    }
} 

谢谢你的回复。我目前的解决办法是你的第一个建议。看来,如果你总是向容器索要你的东西,你就永远不会朝自己的脚开枪。对我来说,许多需要解决的问题开始“感觉”错了。我想补充一点:努力设计组件,使它们能够正常工作,而不管它们在容器中的作用域如何。大多数被建模为纯服务的组件可以被定义为单例或瞬态,并且工作方式相同。我不一定要调用那些
单例
,而是类似于上下文实例。他们没有什么“单身”的地方。@TyCobb-对不起,从外表上看,我可以看出我在这里画得不是很清楚。这意味着IMySingleton已经在我的容器中注册为singleton,而其他类没有.Thx进行响应。我明白你的意思。我认为我的问题的另一部分是我的代码最终看起来像factory central。每次我创建一个无法解决的类时,我都必须为它创建另一个类工厂。这种情况经常发生,尤其是在我们的UI端,所有这些都开始感到相当乏味和令人分心。我想,我们一直这样做是为了通常的国际奥委会/国际奥委会的利益,但这仍然会分散注意力。