我用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.
我不得不将安装程序类修改为:
Classes.FromAssembly(typeof(NHUserLoginRepository).Assembly)
.BasedOn<IRepository>()
.WithService.FromInterface().LifestyleTransient(),
Classes.FromAssembly(typeof(UserLoginService).Assembly)
.BasedOn<IService>()
.WithService.FromInterface().LifestyleTransient(),