【问题标题】:Dependency injection by unitycontainerunitycontainer 依赖注入
【发布时间】:2015-11-24 16:30:36
【问题描述】:

我有一个像这样的 C# 库:

public SomeClass<T> : ISomeClass<T>{
    public SomeClass(IMainClass mainClass){ this._mainclass=mainClass }
}

public MainClass : IMainClass {
    private Dictionary<string,dynamic> _myDic;
    public MainClass() { /* some code */ }
    public ISomeClass<T> ReturnSomeClass()
    {
        if(_myDic.Contains(ISomeClass<T>)
          return _myDic.Value //**someclass<T> type
          //add to _myDic
        return new SomeClass<T>();
    }
}

public OtherClass<T> : IOtherClass<T> {
    public OtherClass(ISomeClass<T> someClass) { this._someClass=someClass }
}

接下来,我在 Microsoft Unity 中为 DI 注册这些类。

class Boot{
    public void Registering(){
        container.RegisterType<ISomeClass,SomeClass>();
        container.RegisterType<IMainClass,MainClass>();
        container.RegisterType<IOtherClass,OtherClass>();
   }
}

当我的客户端类调用 container.Resolve() 时,mainClass 中的 ctor 被触发并创建了 MainClass 的一个实例。现在 container.Resolve() 正在客户端类 ctor 中调用它是火和 DI 创建了一个新的 SomeClass。以及 DI 在创建 SomeClass 时,该类的 ctor 正在调用并创建一个新的 mainClass。

如何在 Resolve by container 上都只有一个 MainClass 创建的对象 在我的客户端类中?

【问题讨论】:

  • 我正在尝试理解您的问题。那么SomeClass 依赖于IMainClass?然后MainClass.ReturnSomeClass 可以创建SomeClass 的实例吗?您想将哪个IMainClass 实例注入SomeClass?您是如何设置服务定位器的?
  • 顺便说一句,the service locator is an anti-pattern 你可能想改变你的设计以使用依赖注入。
  • 如果您将模式定义为反模式只是因为在某些情况下它不适合,那么是的,它是一种反模式。但是有了reasoning all patterns would also be anti patterns
  • Service Locator 是一种反模式,因为根本不存在它是最佳解决方案的场景;总有更好的解决方案;这就是使它成为反模式的原因。
  • 还要注意我对 jgauffin 的回答的评论,解释了为什么他的推理是错误的,而他的反例实际上 不是服务定位器模式的示例。

标签: c# dependency-injection


【解决方案1】:

如果要将 ISomeClass 注册为单例,请设置 lifeTimeManager

Container.RegisterType(ISomeClass, SomeClass, null, new ContainerControlledLifetimeManager());

【讨论】:

  • 由 ContainerControlledLifetimeManager() 创建的对象在整个生命应用程序中。这不是我想要的行为。我想从每个解析新对象中创建对象。但是 mainClass 和 OtherClass 都有相同的 someClass 对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
  • 2014-06-12
  • 2013-04-30
  • 2021-11-19
相关资源
最近更新 更多