好与坏的Unity设计:注入完整的容器或仅显式接口

本文关键字:接口 Unity 设计 注入 | 更新日期: 2023-09-27 18:14:16

这是个好与坏的设计问题。

我发现在我的模块中总是注入完整的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();
   }
}
在教程和unity示例中,我经常看到,你只应该注入你真正需要的资源。它看起来像这样:
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容器中有所有的资源?

未来的问题是什么?

唯一的问题,我看到的未来是,你总是必须有一个统一的容器在未来,如果你没有它,你必须重写模块。

你觉得怎么样?

EDIT:我找到的一些最好的答案是,第一个版本不是依赖注入,它是某种"服务定位器模式",这可能会导致许多问题。

可以在这里找到:

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

好与坏的Unity设计:注入完整的容器或仅显式接口

在第一种方法中,您已经获得了对所需接口的依赖,而且您还向容器中添加了另一个接口:

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

因此,您违背了使用DI的主要原因之一。