1

我目前使用自己的依赖注入框架。它非常轻量级并且可以完成工作,但是我正在寻找面向方面的编程并且需要更好的东西。我正在测试 Castle Windsor,因为它能够进行基于代理的运行时拦截。

我使用从 web.config 安装的 Castle Windsor 编写了一个简单的 MVC 应用程序,它运行良好。问题是我必须单独注册每个控制器。在具有大量控制器的应用程序中,这将变得乏味。

网络配置

<castle>
  <components>
    <component id="LoggerInterceptor" type="MvcApp.LoggerInterceptor, MvcApp" lifestyle="Singleton"/>
    <component Name="AccountController" type="MvcApp.Controllers.AccountController, MvcApp" lifestyle="Transient">
      <interceptors>
        <interceptor>${LoggerInterceptor}</interceptor>
      </interceptors>
    </component>
    <component Name="HomeController" type="MvcApp.Controllers.HomeController, MvcApp" lifestyle="Transient">
      <interceptors>
        <interceptor>${LoggerInterceptor}</interceptor>
      </interceptors>
    </component>      
  </components>
</castle>

使用 Fluent Registration API 注册方法,可以在一行代码中注册所有控制器。不幸的是,这完全违背了使用运行时代理的目的。如果我希望我的 AOP 配置与我的代码一起编译,我将使用 PostSharp 之类的东西来编译时间编织。

流畅的注册 API

public void Install(IWindsorContainer container, IConfigurationStore store)
{
    container.Register(Classes.FromThisAssembly()
             .BasedOn<IController>()
             .LifestyleTransient()
             .Configure((c => c.LifeStyle.Transient.Interceptors<LogInterceptor>())));
}

我将始终注册我的控制器,因此在代码中使用它不是问题,但是我想通过 config.xml 确定使用哪些依赖项、参数和拦截器。

所以 ...

有没有办法通过 web.config 使用单个组件元素注册所有控制器?

或者

有没有办法混合配置,使控制器通过代码注册,但它们的拦截器在 web.config 中完成?

4

1 回答 1

0

Is there a way to register all of the controllers via web.config with a single component element?

I guees not

Is there a way to mix the configurations such that the controllers are registered via code, but everything else is done in the web.config?

Sure. Let say you have one of your controller depending on a specific service.
You can register all your controllers via Fluent api as you did and register that single service explicitly in the config.
Just keep in mind what you register in the config will be registered first int the container.
Order registration is relevant only in case of multiple registration for same interface, not for resolution itself.

于 2013-09-25T09:08:45.097 回答