Castle Windsor多个接口的自动注册及其相应的实现
本文关键字:实现 注册 Windsor 接口 Castle | 更新日期: 2023-09-27 18:24:50
如果我有以下设置:
public interface IUsersQuery{}
public class UsersQuery : IUsersQuery {}
public interface ICompanyQuery{}
public class CompanyQuery : ICompanyQuery {}
是否可以一次自动注册所有IABCQuery及其相应的实现ABCQuery,而不是逐个注册:
container.Regsiter(
Component.For<ICompanyQuery>().ImplementedBy<CompanyQuery>(),
Component.For<IUsersQuery>().ImplementedBy<UsersQuery>()
)
我在想,如果我在接口上添加某种标记,
public interface IEnhancedQuery {}
public interface IUsersQuery : IEnhanceQuery {}
public interface ICompanyQuery : IEnhancedQuery {}
然后我可能可以做到,但我很难想出通过AllTypes自动注册的方法。
container.Register(AllTypes.FromThisAssembly().BasedOn<IEnhancedQuery>());
var iQueries = container.ResolveAll<IEnhancedQuery>();
foreach (IEnhancedQuery p in iQueries)
{
var actualInterface = // how to get the actual interface type of p;
// would the following work?
container.Register(Component.For(actualInterface)
.ImplementedBy(AllTypes.FromThisAssembly().BasedOn(actualInterface)
.WithService.FirstInterface()));
}
container.Register(
Classes.FromThisAssembly()
.Where(Component.IsInTheSameNamespaceAs<IUsersQuery>())
.WithServiceDefaultInterfaces()
.LifestyleTransient()
);
文档详细介绍了所有选项。
我不确定Castle是否具有自动注册功能,但您可以使用反射实现一个。
这似乎不是一项很难完成的任务:
1.查找名称以Query 结尾的所有接口
2.根据您的规则,检查是否有可用于此接口的类型
3.如果类型存在,则注册组件。