У меня есть универсальный интерфейс IRepository, который имеет одну конкретную универсальную реализацию MyRepository.Я использую следующий код для регистрации всех возможных типов T за один раз:
container.Register(CastleReg.Component.For<typeof(IRepository<>)).ImplementedBy(typeof(MyRepository<>)).LifeStyle.Transient)
У меня зарегистрированы другие классы, которые сами имеют в своем конструкторе что-то вроде этого:
public SomeClass(IRepository<Person> myRep)
{
...
Проблема в том, что класс SomeClass мог быть зарегистрирован как Singleton LifeStyle, что означает, что свойство myRep разрешается один раз.Чтобы разрешить myRep, когда это действительно необходимо, я узнал, что могу использовать следующий синтаксис:
public SomeClass(Func<IRepository<Person>> myRepFactory)
, а затем использовать следующее для получения реального хранилища:
myRepFactory().DoSomeQuery()
Теперь моя проблема связана с тем, как я сообщаю контейнеру, что myRepFactory должен быть разрешен до заводского метода, который сам будет разрешаться, как и раньше?
Я думал, что мог бы добавить это к регистрации, но регистрация не удалась сArgumentNullException для ключевого параметра:
container.Register(CastleReg.Component.For(typeof(Func<>).MakeGenericType(typeof(IRepository<>))).UsingFactoryMethod(() => container.Resolve(typeof(IRepository<>))).LifeStyle.Transient)
Как настроить регистрацию так, чтобы она позволяла разрешать как IRepository<Person>
типы параметров, так и Func<IRepository<Person>>
типы параметров?
Заранее спасибо,
Марк
PS Я использую Castle.Windsor 2.5.1