我在这里阅读了有关该论点的各种其他问题,最值得注意的是
Ioc/DI - 为什么我必须在入口应用程序中引用所有层/组件?
和这篇文章(和其他各种材料)。
但是,我不清楚在库 (DLL) .NET 项目中将组合根放在哪里。该项目不属于文章中提到的任何特定类型。在桌面、控制台甚至 Web 应用程序中,这一点被明确定义。
我目前的做法是包装容器,注册类型并重新公开 Resolve 方法:
class DefaultBootstrapper : IBootstrapper {
public Bootstrapper() {
_container = new XXXContainer();
RegisterTypes(_container);
}
public T Resolve<T>() where T : class {
return _container.Resolve<T>();
}
// + other _container.Resolve() overloads
private readonly XXXContainer _container;
}
然后我阻止库使用者创建库的根实例(例如定义内部构造函数),从而强制使用单例工厂:
class XYZFactory {
static XYZFactory() {}
private XYZFactory(IBootstrapper bootstrapper) {
_bootstrapper = bootstrapper;
}
public static XYZFactory Instance {
get { return Singleton; }
}
public ABCType CreateABCType(string param1) {
return _bootstrapper.Resolve<ABCType>(param1, _bootstrapper.Resolve<Dependency1>);
}
private static readonly XYZFactory Singleton = XYZFactory(new DefaultBootstrapper);
private readonly IBootstrapper _bootstrapper;
}
问题是,有更好的方法或更好的模式来定位库项目中的组合根吗?