Замок Виндзор бегло оформлен: AllTypes и переадресация типов - PullRequest
3 голосов
/ 23 марта 2010

Имеются следующие классы / интерфейсы:

class Repository<T> : IRepository<T> {}
class UserRepository : Repository<User>, IUserRepository {}

Есть ли простой способ преобразовать это:

container.Register(
    Component.For<IUserRepository>()
        .Forward<IRepository<User>>()
            .ImplementedBy<UserRepository>()
    );

В автоматическую регистрацию через AllTypes? Пока что мне не хватает переадресации.

container.Register(
    AllTypes.FromAssemblyContaining(typeof(IUserRepository))
        .BasedOn(typeof(Repository<>))
        .WithService.Select((t, b) => new List<Type>  {
            t.GetInterfaces().Where( x => !x.IsGenericType ).FirstOrDefault()
        })
);

а с пересылкой типа? Так что это будет работать:

container.Resolve<IUserRepository>().GetType() == container.Resolve<IRepository<User>>().GetType()

Следующий код не совсем работает, так как FirstInterface () возвращает IRepository :

container.Register(
    AllTypes.FromAssemblyContaining(typeof(IUserRepository))
        .BasedOn(typeof(Repository<>))
        .WithService.FirstInterface()
);

Редактировать: я был довольно близко, поэтому в моем случае:

container.Register(
    AllTypes.FromAssemblyContaining(typeof(IUserRepository))
        .BasedOn(typeof(Repository<>))
        .WithService.Select((t, b) => new List<Type>  {
            t.GetInterfaces()
        })
);

1 Ответ

3 голосов
/ 24 марта 2010

Я могу быть не точным, так как пишу это по памяти:

Перегрузка WithService.Select. Там вы можете передать пользовательский метод, который возвращает IEnumerable. Затем вы можете использовать его, чтобы соответствовать вашим типам соответственно.

...