Может ли неявная регистрация фабрики делегатов Windsor's TypedFactoryFacility быть отключена? - PullRequest
3 голосов
/ 13 мая 2011

Мы используем фабричный завод Виндзора и думаем, что это прекрасно.Мы используем фабрики на основе интерфейса .Однако мы хотели бы отключить некоторые подмножества фабрик на основе делегатов , в частности неявно зарегистрированных фабрик .Это противоречит интуиции не потому, что они являются делегатами, а потому, что они волшебным образом созданы и могут задержать сбой.

Если у нас есть класс, который принимает делегата в качестве зависимости

class X { public X(Func<int,IPrincipal> d); }

А затем зарегистрируйте его в контейнере, в котором зарегистрировано типовое производственное оборудование.

container.Kernel.Register(Component.For<X>().ImplementedBy<X>())

Я могу разрешить его без каких-либо проблем, что поначалу нелогично, поскольку никто не сказал контейнеру, что у нас есть что-то дляскажем о Func<int,IPrincipal>.

var x = container.Resolve<X>();

И я не столкнусь с ошибкой, пока не попытаюсь реально использовать эту неявно созданную фабрику.

x.D(0); // no registration for IPrincipal

Хотя это имеет смысл с определеннойТочка зрения, тот факт, что эта фабрика неявно создана, является проблематичным.Это очень контейнеросознательное поведение.Люди, которые пишут произвольные классы, сочтут полезным параметризовать свое поведение с помощью делегатов, и как только мы помещаем их в контейнер IoC, мы сталкиваемся с этим удивительным поведением.

Тем не менее существует одна умная неявная фабрика, котораяПохоже, это стоит сохранить.Прямо сейчас Windsor создаст простую фабрику для зависимостей вида Func<T>, позволяющую потребителю зависимости задерживать фактическое создание.В среде 4.0 может иметь смысл изменить это так, чтобы распознавать Lazy<T> как явное указание на то, что вы просто откладываете конструкцию T, а не пытаетесь получить доступ к фабрике, которая будет реализовывать интересную политику.

Есть ли умный переключатель для настройки TypedFactoryFacility или нам нужно реализовать несколько новых объектов, чтобы получить желаемое поведение?

1 Ответ

1 голос
/ 13 мая 2011

Если вы действительно хотите, вы можете удалить компонент DelegateFactory из контейнера, что создает фабрики на основе делегатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...