我想为我的存储库实现自动注册,遵循以下约定:
存储库实现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>()));