Замок Виндзор: Регистрация по соглашению, открытые дженерики
У меня есть такой интерфейс:
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