Замок Виндзор Автоматическая регистрация нескольких интерфейсов и их соответствующих реализаций - PullRequest
2 голосов
/ 17 февраля 2012

Если у меня есть следующие настройки:

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

Ответы [ 2 ]

3 голосов
/ 17 февраля 2012
container.Register(
   Classes.FromThisAssembly()
      .Where(Component.IsInTheSameNamespaceAs<IUsersQuery>())
      .WithServiceDefaultInterfaces()
      .LifestyleTransient()
);

В документации подробно описаны все опции.

0 голосов
/ 17 февраля 2012

Я не уверен, есть ли у Castle функция автоматической регистрации, но вы можете реализовать ее с помощью отражения.

Это не кажется очень сложной задачей:

1.Найдите всеинтерфейсы, имена которых оканчиваются на Query

2. Проверьте, доступен ли тип для этого интерфейса в соответствии с вашим правилом

3.Если тип существует, зарегистрируйте компонент.

...