2011-09-02 82 views
3

我有一個大型的現有解決方案,使用CastleWindsor作爲更新層/項目的DI框架。我目前正試圖在沒有以前的DI的層/項目中實現一些新功能,但我一直在收到「循環引用」問題。哪裏是放置WindsorContainer並避免循環項目參考的最佳地點?

鑑於這樣一個解決方案...

  • MyCompany.Core - 包括CastleWindsorConfiguration
  • MyCompany.BusinessLayer - 包括實體&業務邏輯
  • MyCompany.Data - 包括NHibernate的映射&庫
  • MyCompany.Emails - 存在非DI功能以補充BusinessLayer
  • MyCompa ny.Web - 網絡應用弗朗端/顯示器

在現實中其實有不少BusinessLayer supplimentry項目/層

我不能MyCompany.Emails因爲CastleWindsor容器添加到MyCompany.Core參考在覈心引用了電子郵件的項目,所以它可以配置/用下面的映射......

_windsorContainer.Register(Component.For<IEMailPoolHandler>().ImplementedBy(typeof(EMailPoolHandler)).LifeStyle.PerWebRequest); 

但後來我需要解決的電子郵件項目這種依賴的東西,如下面...

private IEMailPoolHandler EMailPoolHandler 
{ 
    get 
    { 
     return MyCompany.Core.WindsorContainer.Resolve<IEMailPoolHandler>(); 
    } 
} 

在這裏我得到了循環引用錯誤。基本上我不能參考核心,因爲它引用了電子郵件。

所以,真正的問題是,處理這種情況的最佳方法是什麼,我應該在哪裏擁有我的CastleWindsor容器?或者可以有多個?例如每個項目中有一個?

回答

2

你應該把它放在.Web項目中。我相信這個項目是實際的應用程序控制生命週期和整體配置 - 應該從容器配置,實例化和解決。

然後,您應該 - 如果可能的話 - 將EmailPoolHandler或EmailPoolHandlerFactory注入(Email或者EmailPoolHandlerFactory)到Email項目的類中,而不是從那裏訪​​問容器。

0

你可以沒有它在自己的項目,然後只是讓所有的東西都參考它嗎?

+0

是的我可以但我仍然會面臨同樣的問題。容器的配置需要能夠看到Emails項目,因此它可以映射實現,但Emails項目需要引用castle windsor項目,以便它可以解決那些實現 –

+0

好的,我看到了,我可能會刪除我的答案,可能不是很有幫助。 –