关于c#:这是“Bastard注射反模式”的一个很好的例子吗?

Is this a good example of the “Bastard injection anti-pattern”?

我看到主要开发人员编写这样的代码,在阅读MarkSeemann的书"依赖项注入到.NET"时,我想知道特定的"新"是否是"外来的",因此是"私生子注入"??

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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()) { }


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

这样就不会是混蛋注入了,因为所有这些类都生活在同一个模块中。造成这种情况如此糟糕的原因是您拖动依赖项,现在您的类与这些类紧密耦合。如果我选择使用自己的日志记录版本,我就必须使用DLL来进行日志记录等等,即使我不使用,这也否定了模块化应用程序设计的好处。


我碰巧从一个朋友那里借了那本书,.net中的依赖注入。我明白你在说什么。我相信这是"混蛋注射"。这是一个残酷的术语,但我认为,毕竟coldfusion(咳嗽)有一个"cfabort"标签作为语言的一部分是合适的。

另外,我注意到一篇好文章,博客文章如何不做依赖注入-静态或单例容器。

基本上,在我们开始之前,让我们先做些事情:

依赖注入!=使用IOC容器"

这是一个问题,"这是静态容器的诞生。我们不更改控制器的构造函数来接受依赖项,而是更改服务的实例化行,以使用容器来解析它。"

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 public class HomeController
 {
    private readonly IExampleService _service;

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

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