我目前使用自己的依赖注入框架。它非常轻量级并且可以完成工作,但是我正在寻找面向方面的编程并且需要更好的东西。我正在测试 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 中完成?