C# 这是一个很好的例子吗;私生子注射反模式;?

C# 这是一个很好的例子吗;私生子注射反模式;?,c#,dependency-injection,constructor,inversion-of-control,C#,Dependency Injection,Constructor,Inversion Of Control,我看到首席开发人员编写了这样的代码,读了Mark Seemann的书《.NET中的依赖注入》后,我想知道具体的“新”是否是“外来的”,因此是“私生子注入” 这看起来确实像是一个典型的注射私生子的例子。原因是因为您有四个外部默认值。外部默认值是指类型来自不同模块/项目/DLL的默认值。我会将名称空间包含到该定义中,因为名称空间可以表示边界,在将来的某一点上,您可以突破到它自己的模块中。这更需要注意的是,当您决定使用本地默认值时(将来我会将其拆分为自己的模块吗?) 这样就不会出现这种情况,因为所有这

我看到首席开发人员编写了这样的代码,读了Mark Seemann的书《.NET中的依赖注入》后,我想知道具体的“新”是否是“外来的”,因此是“私生子注入”


这看起来确实像是一个典型的注射私生子的例子。原因是因为您有四个外部默认值。外部默认值是指类型来自不同模块/项目/DLL的默认值。我会将名称空间包含到该定义中,因为名称空间可以表示边界,在将来的某一点上,您可以突破到它自己的模块中。这更需要注意的是,当您决定使用本地默认值时(将来我会将其拆分为自己的模块吗?)


这样就不会出现这种情况,因为所有这些类都生活在同一个模块中。这之所以如此糟糕,是因为您将依赖项拖到一起,而现在您的类与这些类紧密耦合。如果我选择使用自己版本的日志记录,我必须随身携带DLL进行日志记录等等,即使我没有使用,这也否定了模块化应用程序设计的好处。

我碰巧从朋友那里借了那本书,.NET中的依赖注入。我明白你在说什么。我相信这是“私生子注射”。这是一个残酷的术语,但我认为cough毕竟有一个“CFABORT”标记作为语言的一部分

另外,我注意到一篇好文章,博客帖子

基本上,在我们开始之前,让我们先解决一些问题:

依赖注入!=使用IoC容器“

这里是kicker,“这是静态容器的诞生。我们没有更改控制器的构造函数以接受依赖项,而是更改实例化服务的行,以使用容器来解析它。”

公共类HomeController
{
私有只读IExampleService\u服务;
公共家庭控制器()
{
_service=Container.Instance.Resolve();
}
公共行动结果索引()
{
返回视图(_service.GetSomething());
}
}

另一方面,四个参数推高了可感知DI的极限(作者说他的极限通常是四个)因为它迫使你开始质疑SessionInitServiceManager是否违反了SRP。通过另一个manager类也表明可能是这样。是的,我记得读过3-4是一般限制。有没有关于如何避免这个新问题的好例子,有没有像unity这样的IOC容器?答案取决于是否有任何“默认”实现都是在同一个库或不同的库中定义的。@MarkSeemann好的,这为我澄清了问题。谢谢Mark!我很喜欢你的书,顺便说一句。谢谢!在默认构造函数中,你实际上在使用服务定位器反模式,你怎么知道容器将为y提供IExampleService如果没有,在索引方法NullArgumentException中,它看起来“很好”。这不是使用IoC容器,而是以错误的方式应用DI
public class SessionInitServiceManager
{
    protected readonly ICESTraceManager _traceManager;
    protected readonly ILogger _logger;
    protected readonly IAggregateCalls _aggregator;
    protected readonly IMultiCoreRepository _repository;

    public SessionInitServiceManager(ICESTraceManager traceManager,
                                     ILogger logger,
                                     IAggregateCalls aggregator,
                                     IMultiCoreRepository repository)
    {
        _traceManager = traceManager;
        _logger = logger;
        _aggregator = aggregator;
        _repository = repository;
    }

    public SessionInitServiceManager() : this(new CESTraceManager(),
                                              new Logger("BusinessServices.authenticateUser"),
                                              new Aggregator(),
                                              new RepositoryFactory().BuildMultiCoreRepository()) { }
 public class HomeController
 {
    private readonly IExampleService _service;

    public HomeController()
    {
      _service = Container.Instance.Resolve<IExampleService>();
    }

    public ActionResult Index()
    {
      return View(_service.GetSomething());
    }
 }