2012-05-23 31 views
1

想象一下,我有包含2个类库项目的解决方案:project1公开一些接口,project2公开一些接口并且(!)消耗来自project1的接口。我还有project3,它使用所有必要的接口绑定来设置Ninject内核模块。这看起来像如下:如何避免VS装配循环参考以访问DI容器(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

项目3是否需要使用DI容器 - 您不能将它的依赖项注入到它中,而不是让它自己解决它?如果你不能,那么将DiContainer转移到project1可能是有意义的,因为这是将这一切结合在一起的粘合剂。将project2接口移动到project1中以使3不需要依赖2也是有意义的。 – Rup

回答

1

您可以将您的接口移动到另一个程序集。

依赖倒置和依赖注入很好地结合在一起,但如果你不小心,一个可以纠结。

它只是需要一些习惯于如何构建您的项目。

编辑

确定,可能不是简单的:)但你应该打出的相关位。在您的解决方案的一部分基础设施项目中包含接线可能会更容易。它不必是一个单独的项目,因为它与您的解决方案密切相关。

2

如果您的project2必须在project3中引用您的组合根,那么您在那里做错了什么。最有可能你在做

kernel.Get<ISomeDependency>() 

正确的方法是使用工厂。看看工厂扩展。