[英]How can I pass a runtime parameter to a previously registered factory method using castle windsor?
[英]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
方法(及其变型ConfigureIf
和ConfigureFor
),使您可以在组件上调用单一方法。 因此,您可以使用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());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.