Castle Windsor中能否为Forward服务单独设置与For服务不同的名称?
解答
Castle Windsor v3.3.0 原生没有提供带别名参数的 Forward 重载,默认只有第一个通过 .For() 声明的主服务可以通过 .Named() 方法指定别名,所有通过 .Forward() 追加的服务类型不会生成独立别名。
可用解决方案
方案1:拆分独立注册(最稳妥无需扩展)
你猜测的单独注册每个服务类型的方案完全可行,所有服务绑定同一个实现类即可,示例代码如下:
var implType = typeof(ServiceImpl<SomeOtherClass>); // 注册SqlConnection对应服务 container.Register(Component .For<IService<SqlConnection, SomeOtherClass>>() .Named(NameHelper.GetName(typeof(SqlConnection), typeof(SomeOtherClass))) .ImplementedBy(implType) .LifestyleTransient()); // 注册DbConnection对应服务 container.Register(Component .For<IService<DbConnection, SomeOtherClass>>() .Named(NameHelper.GetName(typeof(DbConnection), typeof(SomeOtherClass))) .ImplementedBy(implType) .LifestyleTransient()); // 注册IDbConnection对应服务 container.Register(Component .For<IService<IDbConnection, SomeOtherClass>>() .Named(NameHelper.GetName(typeof(IDbConnection), typeof(SomeOtherClass))) .ImplementedBy(implType) .LifestyleTransient());
如果需要减少重复代码,可以将公共配置抽成通用方法复用。
方案2:自定义扩展方法实现你要的Forward带参语法
你可以自己写扩展方法封装注册逻辑,实现你期望的写法:
/// <summary> /// Castle Windsor 注册扩展 /// </summary> public static class RegistrationExtensions { public static ComponentRegistration Forward<TService>(this ComponentRegistration registration, string serviceName) { // 追加注册指定服务类型,绑定同一实现、设置独立别名 container.Register(Component.For<TService>() .Named(serviceName) .ImplementedBy(registration.Implementation) .LifeStyle.Is(registration.LifestyleType)); return registration; } }
扩展完成后即可使用你想要的注册写法:
container.Register(Component .For<IService<SqlConnection, SomeOtherClass>>() .Named(NameHelper.GetName(typeof(SqlConnection), typeof(SomeOtherClass))) .Forward<IService<DbConnection, SomeOtherClass>>(NameHelper.GetName(typeof(DbConnection), typeof(SomeOtherClass))) .Forward<IService<IDbConnection, SomeOtherClass>>(NameHelper.GetName(typeof(IDbConnection), typeof(SomeOtherClass))) .ImplementedBy<ServiceImpl<SomeOtherClass>>() .LifestyleTransient());
注意:如果编译时找不到Implementation、LifestyleType等属性,可以根据v3.3.0的实际API名称做对应调整即可。
内容的提问来源于stack exchange,提问作者Chrisgh
相关产品推荐
相关产品推荐

