2010-01-08 2 views
2

В настоящее время я использую Autofac, но я открыт для комментариев относительно других контейнеров IOC. Я бы предпочел решение, используя Autofac, если это возможно. Я также несколько новичок в МОК, поэтому я могу грубо непонимаю, для чего я должен использовать контейнер МОК.IOC/Autofac container

В принципе, ситуация выглядит следующим образом:

У меня есть верхний контейнер МОК для моего приложения. У меня есть дерево дочерних контейнеров/областей, где мне бы хотелось, чтобы одна и та же «служба» (IWhatever) решалась по-разному в зависимости от того, какой уровень в дереве разрешен. Кроме того, если служба не зарегистрирована на каком-то уровне в дереве, я бы хотел, чтобы дерево было пересечено вверх до тех пор, пока не будет найдена подходящая реализация.

Кроме того, при построении данного компонента вполне возможно, что мне понадобится доступ к родительскому контейнеру/сфере. Во многих случаях компонент, который я регистрирую, будет иметь зависимость от той же самой или другой службы в родительской области.

Есть ли способ выразить эту зависимость с помощью Autofac? Что-то вроде:

builder.Register(c=> 
{ 
    var parentComponent = ?.Resolve<ISomeService>(); 
    var childComponent = new ConcreteService(parentComponent, args...); 
    return childComponent; 
}).As<ISomeService>(); 

я не могу получить что-либо подобное приведенному выше псевдокоде работать по нескольким причинам:

A) Кажется, что все уровни в доле сфера дерева общий набор регистраций. Кажется, я не могу найти способ сделать определенную регистрацию ограниченной определенной «областью».

B) Кажется, я не могу найти способ захватить родительскую область данной области. Я могу разрешить ILifetimeScope в контейнере, а затем применить его к конкретному экземпляру LifetimeScope, который предоставляет свою родительскую область, но я предполагаю, что это, вероятно, примечание, предназначенное для использования таким образом. Это безопасно?

C) Я не уверен, как сообщить Autofac, что контейнер владеет разрешенным объектом. Для многих компонентов я хотел бы, чтобы компонент был «принадлежащим» областью, в которой он сконструирован. Могут ли помеченные контексты помочь мне здесь? Должен ли я отмечать каждый уровень дерева уникальным тегом? Это было бы трудно, потому что глубина дерева определяется во время выполнения.

Извините за чрезвычайно длительный вопрос. В резюме:

1) Есть ли способ сделать то, что я хочу сделать, используя Autofac?

2) Есть ли другой контейнер, более подходящий для такого рода структуры зависимостей?

3) Является ли IOC неправильным инструментом для этого вообще?

ответ

2

Autofac 1.4 поддерживает это легко и, вероятно, лучший выбор здесь прямо сейчас. Вы можете просто зарегистрировать дочерние компоненты контейнера в дочернем контейнере.

Autofac 2, который вы используете, еще не имеет простого эквивалента, хотя он исследуется.

+0

Отлично. Спасибо за помощь - звучит, как мне придется регрессировать до 1,4 (на данный момент). Просто из любопытства, зачем снимать это поведение? Являются ли более распространенные прецеденты лучше поддерживаться моделью охвата продолжительности жизни AutoFac 2, где области охвата жизни имеют общую регистрацию? Или просто потому, что autofac 2 пока еще не завершен. В любом случае - большое спасибо за помощь! – Krazzy

+0

Добро пожаловать. Autofac 2 должен в конечном итоге поддержать это, но модель отличается, поэтому реализация задумается.Изменение модели упрощает добавление «адаптеров» для таких задач, которые в противном случае потребовали бы манипулирования контейнерами. Всего наилучшего! –

Смежные вопросы