【问题标题】:MVC Castle Windsor - can't have more than one parameter in the controller constructorMVC Castle Windsor - 控制器构造函数中不能有多个参数
【发布时间】: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


【解决方案1】:

我不得不将安装程序类修改为:

            Classes.FromAssembly(typeof(NHUserLoginRepository).Assembly)
                   .BasedOn<IRepository>()
                   .WithService.FromInterface().LifestyleTransient(),

            Classes.FromAssembly(typeof(UserLoginService).Assembly)
                   .BasedOn<IService>()
                   .WithService.FromInterface().LifestyleTransient(),

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-17
    • 2014-03-05
    • 2011-04-01
    相关资源
    最近更新 更多