Unity设计的好坏:注入完整的容器或只显示接口?

时间:2015-09-23 14:36:04

标签: c# dependency-injection ioc-container

这是一个糟糕或好的设计问题。

我发现总是在我的模块中注入完整的Unity容器非常方便。

1。)你永远不知道,你需要什么资源。 2.)如果需要更多容器资源,则永远不需要更改类构造函数。

这看起来像这样:

public class ServiceLocator: IServiceLocator
{
    private IUnityContainer _container = null;

    public ServiceLocator(IUnityContainer container)
    {
        _container = container;
    }


    public void DoSomething()
    {
       var x = this._container.Resolve<IXInterface>();
       var y = this._container.Resolve<IYInterface>();      
       x.Do();
       y.Do();
   }
}

在教程和统一示例中,我经常看到,您应该只注入您真正需要的资源。看起来像这样:

public class ServiceLocator: IServiceLocator
{
    private XInterface _x = null;
    private YInterface _y = null;

        public ServiceLocator(Ixnterface x,  IYnterface y)
        {
            _x = x;
            _y = y;
        }


         public void DoSomething()
        {
            _x.Do();
            _y.Do();    
        }
}

我的问题是:

您认为更好的设计是什么?

当Unity容器中包含所有资源时,为什么只注入显式接口?

将来有什么问题?

我看到的唯一问题是,您将来必须拥有Unity容器,如果您没有,那么您必须重写该模块。

您怎么看?

编辑:我发现的一些最好的答案是,第一个版本不是依赖注入,它是某种&#34;服务定位器模式&#34;,这可能导致很多问题。

可以在这里找到:

http://blog.ploeh.dk/2010/02/03/ServiceLocatorisanAnti-Pattern/

1 个答案:

答案 0 :(得分:1)

在第一种方法中,您已经依赖所需的界面,而且还要将另一个添加到容器中

var x = this._container.Resolve<IXInterface>();
var y = this._container.Resolve<IYInterface>();  

因此,您首先要反对DI的主要原因之一。