Замок Виндзорский регистр Компонент по соглашению - PullRequest
2 голосов
/ 26 февраля 2012

Я хочу реализовать автоматическую регистрацию для моих репозиториев, которые следуют этому соглашению:

  • Хранилища внедряют 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 Ответ

1 голос
/ 26 февраля 2012

Нечто подобное может сделать это:

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>()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...