我正在尝试为asp.net MVC构建一个插件架构,它允许覆盖控制器。
在我的App_Start()上我有这个:
ControllerBuilder.Current.SetControllerFactory(
new WindsorControllerFactory(container));
在大会内所有控制器的安装程序之前:
public class ControllersInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store) {
container.Register(Classes.FromThisAssembly().BasedOn<IController>().LifestyleTransient());
}
}
这基于Windsor Tutorial。
现在,在我的插件或模块上,我想注册新的控制器,并能够覆盖已在基础MVC应用程序上注册的特定控制器。
问题是,在使用上面的注册方法时,没有办法调用.Overridable()或.IsDefault()。我怎么能这样做:
public void Install(IWindsorContainer container, IConfigurationStore store) {
container.Register(Classes.FromThisAssembly().
BasedOn<IController>().
LifestyleTransient().
IsDefault()); // This does not compile.
本质上,如何覆盖按类型注册的内容?
答案 0 :(得分:3)
当您使用Classes
之类的会议注册时,您无法直接调用SetDefault
之类的单一方法;因为你要返回一个元素集合,所有这些都不是默认元素,这是没有意义的。 (更准确地说,约定允许您声明您感兴趣的组件的描述;使用的类型是BasedOnDescriptor
。IsDefault
类上存在ComponentRegistration
方法
但是,可以调用Configure
方法(及其变体ConfigureIf
和ConfigureFor
)来调用组件上的单一方法。因此,您可以使用IsDefault
方法
Configure
var regs = Classes
.FromThisAssembly()
.Pick()
.WithServiceAllInterfaces(); // dummy registration
regs.Configure(c => c.IsDefault());
当然,您需要定义默认组件的确定方式。例如,如果默认组件名称包含单词"default"
,您可以使用ConfigureIf
方法:
regs.ConfigureIf(component => component.Name.ToLower().Contains("default"),
component => component.IsDefault());
答案 1 :(得分:0)