【问题标题】:Castle Windsor Ioc container doesn't resolve subdependenciesCastle Windsor Ioc 容器不解决子依赖关系
【发布时间】:2014-04-15 06:58:39
【问题描述】:

我在下一个结构中有“标准”MVC 应用程序:UI (MVC)、业务逻辑和使用 FluentNHibernate 的数据访问。我已经完成了在城堡容器中注册我的组件的所有步骤,如城堡文档中所述,使用了 FluentRegistration API。因此,所有组件都使用 WINdsor 安装程序注册,如下所示:

container.Register(Classes.FromThisAssembly()
            .BasedOn(typeof(IHandlerBase<>))
            .WithService.AllInterfaces()
            .LifestyleTransient());

在此代码中,IHandlerBase - 通用接口,从中派生出我在业务逻辑中的所有嵌套类。数据访问以相同的方式注册,当我启动我的应用程序时,我的所有组件和服务都注册在容器中。 MVC 项目中相对于 BL 的所有依赖项都已解决,但是当我需要业务逻辑中相对于 DataAccess 的依赖项时,它们没有。我的模块的存根示例:

MVC

public ILogger Logger { get; set; } // Resolved, not null
public IHandlerBase<FooRerquest> FooHandler<FooRequest> { get; set; } // Resolved, not null
// Call Foohandler method
FooHandler.MethodName() { ... } // Here works fine

商业逻辑

public ILogger Logger { get; set; } // Unresolved, null
public IRepository <FooCommand> FooRepository<FooCommand> { get; set; } // Unresolved, null
// Call FooRepository method
FooRepository.MethodName() { ... } // Doesn't work, catch ArgumentNullException

ILogger 是一个 Castle NLog 工具

我在哪里做错了什么?

谢谢,安德鲁

【问题讨论】:

  • 如何从业务逻辑创建类的实例?你用container解决了吗?
  • 不,因为据我了解,Castle 会自行解决它,并且可以在 UI 中使用。我需要在业务逻辑中手动解决它吗?
  • 它可以在 UI 中使用,因为 Controllers 是通过自定义 ControllerFactory 创建的,它通常使用 container。如果您的业务逻辑类的实例被解析为 MVC 类的一部分,那么它们应该被解析。如果仅使用构造函数来创建业务逻辑类的实例,那么它们对 IoC 一无所知,并且无法解析所有引用。 我建议你使用构造函数注入,因为它使依赖注入更加明显。
  • 感谢您的建议和帮助!
  • 好的,我已将评论移至答案。

标签: c# asp.net-mvc-4 castle-windsor


【解决方案1】:

它可以在 UI 中使用,因为 Controllers 是通过自定义 ControllerFactory 创建的,该自定义 ControllerFactory 通常使用 container

如果您的业务逻辑类的实例被解析为 MVC 类的一部分,那么它们应该被解析。如果仅使用构造函数来创建业务逻辑类的实例,那么它们对 IoC 一无所知,并且无法解析所有引用。

我建议你使用构造函数注入,因为它使依赖注入更加明显

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-08
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-23
    相关资源
    最近更新 更多