这是“混蛋注射反模式”的一个很好的例子吗?

我看到首席开发人员编写这样的代码并在阅读Mark Seemann的书“.NET中的dependency injection”时,我想知道特定的“新”是否是“外来的”,因此“Bastard Injection”?

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()) { } 

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

这不是Bastard Injection的方式是所有这些类都存在于同一个模块中。 使这个如此糟糕的事情是因为你拖动依赖关系,现在你的类与这些类紧密耦合。 如果我选择使用我自己的日志记录版本,我必须使用DLL进行日志记录等,即使我不使用,也否定模块化应用程序设计的好处。

我碰巧从朋友那里借了那本书,在.NET中dependency injection。 我明白你在说什么。 我相信这是“混蛋注射”。 这是一个残酷的术语,但我认为在所有ColdFusion(咳嗽)都有一个“CFABORT”标签作为语言的一部分。

另外,我注意到一篇好文章,博客文章如何不进行dependency injection – 静态或单例容器

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

dependency injection!=使用IoC容器“

下面是踢球者,“这是静态容器的诞生。我们只是更改实例化服务的行,而不是更改控制器的构造函数以取代它,而是使用容器来解析它。”

  public class HomeController { private readonly IExampleService _service; public HomeController() { _service = Container.Instance.Resolve(); } public ActionResult Index() { return View(_service.GetSomething()); } }