[英]How to add dependency to existing Castle Windsor registration?
我们有一堆控制器,通过BasedOn查询向Castle注册。 我们想在其中一个控制器上添加一个额外的配置依赖项。 我们可能会向所有控制器注册该参数。 以下代码是我们如何解决该问题的方法,但是我想知道是否存在更优雅/内置的解决方案。
public class ControllersInstaller : IWindsorInstaller
{
private readonly IAppConfig _appConfig = new AppConfig();
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(FindControllers().Configure(ConfigureComponentRegistration).LifestyleTransient());
container.Register(Component.For<BarController>()
.LifestyleTransient()
.DependsOn(Dependency.OnValue("faxNumber",
_appConfig.GetAppSetting<string>("FaxNumber"))));
}
private void ConfigureComponentRegistration(ComponentRegistration obj)
{
obj.LifestyleTransient();
}
private BasedOnDescriptor FindControllers()
{
return Classes.FromThisAssembly()
.BasedOn<IController>()
.If(Component.IsInSameNamespaceAs<FooController>(true))
.If(t => t.Name.EndsWith("Controller") && t.Name != "BarController")
.LifestyleTransient();
}
}
我建议您简单地使用一个更具体的版本覆盖现有注册,该版本具有来自_appConfig的必要依赖关系。 因此,您不必使用此过滤器:
t.Name != "BarController"
在这里查看我的答案,以了解如何覆盖现有组件: https : //stackoverflow.com/a/37832194/644891
完全可以,只需使用ConfigureFor<>
方法 。
container.Register(FindAllControllers()
.ConfigureFor<BarController>(x =>
x.DependsOn(Dependency.OnAppSettingsValue("faxNumber"))
)
);
正如我要指出的那样,我不确定为什么您的示例将生存期指定为三倍。 一次就足够了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.