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

Tom*_*kel 17 c# constructor dependency-injection inversion-of-control

我看到首席开发人员编写这样的代码并在阅读Mark Seemann的书".NET中的依赖注入"时,我想知道特定的"新"是否是"外来的",因此"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()) { }
Run Code Online (Sandbox Code Playgroud)

LCa*_*ter 9

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

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