【发布时间】: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