Динамическое добавление общих служб из одной конкретной реализации с использованием Castle Windsor - PullRequest
0 голосов
/ 10 июня 2011

Я использую Замок Виндзор, и у меня есть следующее:

public class NhibernateRepository<T> : IRepository<T>
{
    public NHibernateRepository(...)
    {
        ...
    }

}

Я бы хотел использовать API Fluent Windsor, чтобы зарегистрировать один сервис для каждой модели моего домена

То есть я хотел бы динамически зарегистрировать IRepository<Order>, IRepository<Customer>, IRepository<Article> и т. Д., Используя NHibernateRepository<T>, где T затем обменивается на конкретный тип в каждом случае.

У меня есть что-то вроде этого:

container.Register(AllTypes.FromThisAssembly().Where(x => x.Namespace == "DITest.Repository").WithService.Select(...Something...)

Но я не уверен, что это вообще возможно (AllTypes подразумевает, что я хочу зарегистрировать несколько типов).

Есть какой-нибудь Виндзорский Гуру?

1 Ответ

2 голосов
/ 10 июня 2011

Тривиально с Виндзором:

container.Register(Component.For(typeof(IRepository<>))
          .ImplementedBy(typeof(NHibernateRepository<>)))

Виндзор автоматически закроет универсальные типы с любым заданным аргументом типа.

Обратите внимание, что неуниверсальные перегрузки For и ImplementedBy используются только из-за языкового ограничения - недопустимо C # для указания открытых универсальных типов в качестве аргументов типов (то есть For<IRepository<>> не будет компилироваться)

Больше информации на официальной документации вики .

...