2011-09-02 44 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

好的,我看到了,我可能会删除我的答案,可能不是很有帮助。 –