gpt4 book ai didi

c# - 在 CaSTLe Windsor 中,我如何覆盖使用 FromThisAssembly() 注册的类型

转载 作者:行者123 更新时间:2023-11-30 22:08:03 25 4
gpt4 key购买 nike

我正在尝试为 asp.net MVC 构建一个插件架构,它将允许 Controller 被覆盖。

在我的 App_Start() 上我有这个:

ControllerBuilder.Current.SetControllerFactory(
new WindsorControllerFactory(container));

在组件内所有 Controller 的安装程序之前:

public class ControllersInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store) {
container.Register(Classes.FromThisAssembly().BasedOn<IController>().LifestyleTransient());
}
}

这是基于 Windsor Tutorial .

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

问题是,在使用上述注册方法时,无法调用 .Overridable() 或 .IsDefault()。我怎么能做这样的事情:

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

本质上,如何覆盖按类型注册的东西?

最佳答案

当你使用像Classes这样的约定注册时,你不能直接调用像SetDefault这样的单一方法;这没有意义,因为您要返回一组元素,所有这些元素都不能是默认元素。 (更准确地说,约定允许您声明您感兴趣的组件的描述;使用的类型是 BasedOnDescriptorIsDefault 方法存在于 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());

关于c# - 在 CaSTLe Windsor 中,我如何覆盖使用 FromThisAssembly() 注册的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22533826/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com