【问题标题】:WCF Dependency Injection using Castle Windsor - Please help?使用 Castle Windsor 进行 WCF 依赖注入 - 请帮忙?
【发布时间】:2011-04-24 15:53:26
【问题描述】:

我有一个 WCF 服务,它调用调用存储库的业务组件,我已经使用 Castle Windsor 使用它的 WCF 设施端到端地工作。

WCF 设施注册和其余的组件注册发生在 Global.asax 文件中,如下所示。

公共类全球:System.Web.HttpApplication { 公共 IWindsorContainer 系统容器; protected void Application_Start(object sender, EventArgs e) { 注册依赖(); } 私人无效注册依赖() { SystemContainer = new WindsorContainer(); SystemContainer.AddFacility().Register( Component.For().ImplementedBy(), Component.For().ImplementedBy(), Component.For().ImplementedBy(), Component.For().ImplementedBy() ); } }

一切都很好,但现在我需要在我的一个组件中引用这个容器,以便我可以像这样解析其他组件。

公共类 BookingBll : IBookingBll { 私人 IBookingRepository _repository; 私人 ILogger _logger; 公共 BookingBll(IBookingRepository 存储库) { _repository = 存储库; _logger = SystemContainer.Resolve(); // 这不会 //编译因为我们无法访问全局类属性。 } 公共无效添加(预订预订) { //一些实现; _logger.Write(); } }

此外,我希望这个容器在全球范围内可用并且不想一遍又一遍地运行注册,所以我应该考虑在 HttpRuntime.Cache 中关闭这个容器以便它可用并且任何组件都可以简单地从缓存中获取它并解决他们想要的任何界面。

请原谅我的无知,因为我是 WCF 和温莎城堡的新手,整个建筑在截止日期前都被扼杀了:-(

【问题讨论】:

  • 你在这里做了什么?我也有同样的情况。

标签: c# wcf dependency-injection castle-windsor


【解决方案1】:

【讨论】:

  • 感谢您的回复,但 IInstanceProvider 、 IServiceBehavior 和服务主机工厂的扩展已由 WCF 设施负责。事实上,我已经在我的 .svc 文件中提到如何使用这一行创建服务工厂 并且端到端的工作是容器在 global.asax.cs 文件中,我如何在代码中引用容器。
【解决方案2】:

你可以依赖 IKernel,它是由 Windsor 自动提供的。

 public BookingBll(IKernel kernel, IBookingRepository repository) {}

如果你真的,真的需要 IWindsorContainer,你可以在容器中注册它,如果你愿意,可以自行注册:-)

SystemContainer.Register(Component.For<IWindsorContainer>.Instance(SystemContainer));

那么你的 ctor 会变成:

public BookingBll(IWindsorContainer container, IBookingRepository repository) {}

通常不赞成对容器/内核进行依赖,最好注入您需要的组件,因为它会使您的依赖项更加清晰并且您的代码可测试。获取容器依赖项就像将 Global.SystemContainer 设为“公共静态”并从应用程序的任何位置引用它。

在您的示例中,ILogger(如果是 Castle.Core.ILogger)可以由 LoggingFacility 注入,无需自己解决。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2023-03-10
    • 2015-04-05
    相关资源
    最近更新 更多