繁体   English   中英

在温莎城堡中,我该如何覆盖在FromThisAssembly()中注册的类型

[英]In Castle Windsor how can I override a type registered with FromThisAssembly()

我正在尝试为asp.net MVC构建一个插件体系结构,该体系结构将允许覆盖Controller。

在我的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());
    }
}

这基于“ 温莎教程”

现在,在我的插件或模块上,我想注册新的Controller,并能够覆盖已经在基本MVC应用程序上注册的特定控制器。

问题是,使用上述注册方法时,无法调用.Overridable()或.IsDefault()。 我该怎么做:

public void Install(IWindsorContainer container, IConfigurationStore store) {
            container.Register(Classes.FromThisAssembly().
            BasedOn<IController>().
            LifestyleTransient().
            IsDefault()); // This does not compile.

本质上,如何重写按类型注册的内容?

当您使用诸如SetDefault Classes的约定注册时,您不能直接调用诸如SetDefault Classes单一方法。 因为您将返回一组元素,而所有元素都不可以是默认元素,所以这没有任何意义。 (为了更精确,公约让您声明自己感兴趣的组件的描述;所使用的类型是一个BasedOnDescriptor的。 IsDefault方法上存在ComponentRegistration类)

但是,可以调用Configure方法(及其变型ConfigureIfConfigureFor ),使您可以在组件上调用单一方法。 因此,您可以使用Configure方法调用IsDefault

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());

在Windsor中,第一个注册获胜,因此服务的后续注册将不会覆盖初始注册。

因此,您要做的是先执行最特定的注册, 然后再进行更常规的基于约定的自动注册。

请参见“ 在温莎第一个胜利 ”关于页面。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM