温莎城堡按公约注册组件

时间:2012-02-26 19:10:04

标签: c# dependency-injection inversion-of-control castle-windsor

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

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

我想使用castle将依赖项注入我的控制器。

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

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

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

这样的东西,只有自动注册,所以每次创建一个新的存储库时,我都不必手动添加所有存储库

1 个答案:

答案 0 :(得分:1)

这样的事可能会这样做:

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