【发布时间】:2015-02-17 22:22:56
【问题描述】:
我使用 Castle Windsor 设置了我的 MVC 应用程序,来自 http://www.codeproject.com/Articles/543810/Dependency-Injection-and-Unit-Of-Work-using-Castle
当我有以下代码时,编译器进入第一个构造函数,我的服务没有被初始化。
private readonly IUserLoginService userLoginService;
private readonly IUserMessageService userMessageService;
public BaseApiController()
{
}
public BaseApiController(IUserLoginService userLoginService, IUserMessageService userMessageService)
{
this.userLoginService = userLoginService;
this.userMessageService = userMessageService;
}
但是,当我删除第二个参数时,编译器会进入这个(正确的)构造函数
public BaseApiController(IUserLoginService userLoginService)
{
this.userLoginService = userLoginService;
}
那么,我不能向 ApiController 构造函数添加多个参数的原因是什么?所有服务都在同一个命名空间中。
容器安装类:
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Kernel.ComponentRegistered += Kernel_ComponentRegistered;
//Register all controllers
container.Register(
//Nhibernate session factory
Component.For<ISessionFactory>().UsingFactoryMethod(
//CreateNhSessionFactory
NHSessionFactoryCreator.CreateNhSessionFactory
).LifeStyle.Singleton,
//Unitofwork interceptor
Component.For<NHUnitOfWorkInterceptor>().LifeStyle.Transient,
//All repoistories
Classes.FromAssembly(Assembly.GetAssembly(typeof(NHUserLoginRepository))).InSameNamespaceAs<NHUserLoginRepository>().WithService.DefaultInterfaces().LifestyleTransient(),
//All services
Classes.FromAssembly(Assembly.GetAssembly(typeof(UserLoginService))).InSameNamespaceAs<UserLoginService>().WithService.DefaultInterfaces().LifestyleTransient(),
//All MVC controllers
Classes.FromThisAssembly().BasedOn<IController>().LifestyleTransient()
);
}
编辑
我看到 UserMessageService 的错误(UserLoginService 已加载,但它具有与 UserMessageService 相同的声明主体)
Some dependencies of this component could not be statically resolved.
'Core.Services.Implementation.UserMessageService' is waiting for the following dependencies:
- Service 'Core.Repositories.IUserMessagesRepository' which was not registered.
【问题讨论】:
-
你的
IUserMessageService确定在IWindsorContainer注册了吗?如果你在大的container.Register()调用之后放置一个断点,你可以检查container来检查注册了哪些服务
标签: c# asp.net-mvc castle-windsor