放置WindsorContainer并避免循环项目引用的最佳位置在哪里?

时间:2011-09-02 15:12:02

标签: c# .net castle-windsor

我有一个包含多个层的大型现有解决方案,它使用CastleWindsor作为新框架/项目的DI框架。我目前正在尝试在没有先前DI的层/项目中实现一些新功能,但我不断遇到“循环引用”问题。

给出这样的解决方案......

  • MyCompany.Core - 包括CastleWindsorConfiguration
  • MyCompany.BusinessLayer - 包含实体&业务逻辑
  • MyCompany.Data - 包括NHibernate映射&存储库
  • MyCompany.Emails - 存在非DI功能以补充BusinessLayer
  • MyCompany.Web - Web应用程序前端/显示

实际上,实际上有很多BusinessLayer supplimentry项目/图层

我无法在MyCompany.Emails中添加对MyCompany.Core的引用,因为Core中的CastleWindsor容器引用了Emails项目,因此可以使用以下内容配置/映射...

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

但是我需要在Emails项目中解决这种依赖关系,如下所示......

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

在这里我得到循环引用错误。基本上我不能引用Core,因为它引用了电子邮件。

所以,问题的确是,处理这种情况的最佳方法是什么?我应该在哪里使用CastleWindsor容器?或者可以拥有多个?例如,每个项目中有一个?

2 个答案:

答案 0 :(得分:2)

你应该把它放在.Web项目中。我相信这是项目的实际应用程序 - 控制生命周期和整体配置 - 应该从容器配置,实例化和解析。

然后你应该 - 如果可能的话 - 将EmailPoolHandler或EmailPoolHandlerFactory注入(ctor或setter,自动或手动)到Email项目的类中,而不是从那里访​​问容器。

答案 1 :(得分:0)

你能不能在它自己的项目中拥有它,然后让其他一切参考它?