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()));
        }

Castle Windsor多个接口的自动注册及其相应的实现

container.Register(
   Classes.FromThisAssembly()
      .Where(Component.IsInTheSameNamespaceAs<IUsersQuery>())
      .WithServiceDefaultInterfaces()
      .LifestyleTransient()
);

文档详细介绍了所有选项。

我不确定Castle是否具有自动注册功能,但您可以使用反射实现一个。

这似乎不是一项很难完成的任务:

1.查找名称以Query 结尾的所有接口

2.根据您的规则,检查是否有可用于此接口的类型

3.如果类型存在,则注册组件。