我想为我的存储库实现自动注册,遵循以下约定:


存储库实现IRepository
有一个实现IRepository的抽象类,例如:UserRepository
实际的实现以该抽象类的名称结尾,例如:EntityFrameworkUserRepository


我想使用城堡将依赖项注入到我的控制器中。

public LinkService(LinkRepository linkRepository)
{
    if (linkRepository == null)
    {
        throw new ArgumentNullException("linkRepository");
    }
    this.linkRepository = linkRepository;
}


如何将“实现IRepository的组件”映射到“以与组件相同名称结尾的实现”

container.Register(Component.For<LinkRepository>().ImplementedBy<EntityFrameworkLinkRepository>())


像这样,只是自动注册,因此我不必在每次创建新存储库时在此处手动添加所有存储库

最佳答案

这样的事情可能会做到:

var container = new WindsorContainer();
container.Register(
    AllTypes.FromAssemblyContaining<EntityFrameworkLinkRepository>()
        .BasedOn<IRepository>()
        .WithService.Select((type, types) => type.BaseType != null && type.Name.EndsWith(type.BaseType.Name)
                                                    ? new[] {type.BaseType}
                                                    : Enumerable.Empty<Type>()));

10-06 01:27