Замок Виндзор: Как зарегистрировать открытый универсальный тип для инъекций, используя Func <T>и UsingFactoryMethod? - PullRequest
2 голосов
/ 05 мая 2011

У меня есть универсальный интерфейс 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

1 Ответ

3 голосов
/ 05 мая 2011

Просто используйте TypedFactoryFacility , которая поддерживает это из коробки:

...