想象一下,我有包含2个类库项目的解决方案:project1公开了一些接口,project2公开了一些接口,(!)使用了来自project1的接口。我还有project3,它使用所有必要的接口绑定设置Ninject内核模块。这看起来如下:
public class Dependencies : NinjectModule
{
public override void Load()
{
Bind<IFileSystemWatcherFactory>().To<FileSystemWatcherFactory>();
Bind<IFileSystemWatcher>().To<FileSystemWatcher>();
Bind( typeof( IRepository<> ) ).To( typeof( NHibernateRepository<> ) );
Bind<IFileSystemHelper>().To<FileSystemHelper>();
Bind<IFileSystemInfoAdapter>().To<FileSystemInfoAdapter>();
Bind<IFolderMonitor>().To<FolderMonitor>();
Bind<IFolderMonitorBrowser>().To<FolderMonitor>();
Bind<IFileManager>().To<FileManager>();
}
}
public class DiContainer
{
private static IKernel _container;
public static IKernel Instance
{
get
{
if ( _container == null )
_container = new StandardKernel( new Dependencies() );
return _container;
}
}
private DiContainer() { }
}
为了设置绑定,project3需要引用project1和project2。为了使用DI容器,project2需要引用project3 - 但我无法添加它,因为VS显示错误消息,添加此引用会导致循环依赖。
如何处理这个问题?我应该在XML中配置依赖项吗?
答案 0 :(得分:2)
如果你的project2必须在project3中引用你的composit root,那么你在那里做错了。你很可能正在做
kernel.Get<ISomeDependency>()
正确的方法是使用工厂。看看Factory扩展。
答案 1 :(得分:1)
您可以将界面移动到另一个装配体。
依赖性倒置和依赖注入很好地结合在一起,但是如果你不小心的话,一个就会纠结。
只需要习惯一下如何构建项目。
修改强>:
好的,可能不是那么简单:)但你应该拆分相关的位。将您的布线包含在作为解决方案一部分的某些基础架构项目中可能会更容易。它不一定是一个单独的项目,因为它与您的解决方案密切相关。