2012-05-23 38 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>() 

正確的方法是使用工廠。看看工廠擴展。