这是一个糟糕或好的设计问题。
我发现总是在我的模块中注入完整的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/
答案 0 :(得分:1)
在第一种方法中,您已经依赖所需的界面,而且还要将另一个添加到容器中:
var x = this._container.Resolve<IXInterface>();
var y = this._container.Resolve<IYInterface>();
因此,您首先要反对DI的主要原因之一。