Замок Виндзор: Регистрация по соглашению, открытые дженерики

У меня есть такой интерфейс:

public interface IGenericRepository<T>

У меня есть базовый класс, например:

public abstract class GenericRepository<T> : IGenericRepository<T> where T : class

У меня есть такой класс:

public class AGenericRepository<T> : GenericRepository<T> where T : class

Без соглашения я успешно зарегистрировался так:

container.Register(
    Component.For(typeof(GenericRepository<>)).ImplementedBy(typeof(AGenericRepository<>))
);

Я могу успешно разрешить объект следующим образом:

var robot = container.Resolve<GenericRepository<Android>>();

Однако, при попытке зарегистрироваться по соглашению, вот так:

container.Register(Classes.FromThisAssembly()
                            .BasedOn(typeof(GenericRepository<>))
                            .WithService.Base());

Я не могу решить, как я сделал выше. Что дает?

2 ответа

Решение

Написание ответа, так как это может быть слишком длинным (и кодовым) для комментария.

Учитывая следующий код:

public interface IGenericRepository<T> {}
public abstract class GenericRepository<T> : IGenericRepository<T> where T : class {}
public class AGenericRepository<T> : GenericRepository<T> where T : class {}
public class AInstance: AGenericRepository<string>{} 

эта регистрация у меня отлично работает

var container = new WindsorContainer();
container.Register(Classes.FromThisAssembly().BasedOn(typeof (GenericRepository<>)).WithServiceBase());
var result = container.Resolve<GenericRepository<string>>();

У меня такое ощущение, что нам не хватает информации о том, какие классы зарегистрированы.


РЕДАКТИРОВАТЬ: в предлагаемом коде, очевидно, абстрактный базовый класс действует как пробел, чтобы определить, что такое базовый сервис. Если вы используете следующую регистрацию, разрешение работает:

var container = new WindsorContainer();
container.Register(Classes.FromThisAssembly().BasedOn(typeof (GenericRepository<>)).WithServiceAllInterfaces());
var result = container.Resolve<IGenericRepository<string>>();

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

var container = new WindsorContainer();
container.Register(Classes.FromThisAssembly().BasedOn(typeof (GenericRepository<>)).WithServices(typeof(GenericRepository<>)));
var result = container.Resolve<GenericRepository<string>>();
// result is AGenericRepository<string>

DefaultInterfaces() регистрирует только интерфейсы с совпадающим именем.

Соответствие имен означает, что реализующий класс содержит в своем имени имя интерфейса (без I на передней панели).

http://docs.castleproject.org/Windsor.Registering-components-by-conventions.ashx

Другие вопросы по тегам