2010-08-13 2 views
1

У меня возникли проблемы с разработкой классов, чтобы лучше использовать принципы DI/IoC, особенно если класс имеет зависимость от одной из своих зависимостей (то есть X имеет зависимости Y и Z и Y имеют зависимость Z).Работа с отношениями и потенциальными несоответствиями с DI/IoC

пример, вероятно, будет полезно:

Допустим, у меня есть класс, который будет инкапсулировать некоторую информацию о соединении для моего приложения. Назовите это «ConnectionInfo»

class ConnectionInfo 
{ 
    // ... 
} 

Я разработал класс работника, который использует информацию о соединении, так что я буду инъекционным моими зависимости через конструктор.

class Worker 
{ 
    public Worker(ConnectionInfo c) 
    { 
     // ... 
    } 
} 

Теперь, скажем, я хочу построить еще один класс. Ему нужен доступ к информации о подключении, но я также хочу иметь доступ к функциям, предоставляемым классом Worker.

class AnotherClass 
{ 
    public AnotherClass(ConnectionInfo c, Worker w) 
    { 
     // ... 
    } 
} 

Это все хорошо и хорошо. Тем не менее, подразумевается логическая связь между объектом ConnectionInfo, введенным в Рабочий, и объектом ConnectionInfo, введенным в AnotherClass. Дизайн имеет смысл только тогда, когда он один и тот же. Однако это не применяется. Нет ничего, что останавливало бы один ConnectionInfo, который был бы добавлен в AnotherClass, и полностью несвязанный ConnectionInfo, который был бы введен в Рабочий.

Я имею дело с IoC/DI в неправильном направлении?
Должны ли классы разрабатываться по-разному или должны быть обработаны иным способом (например, принудительное выполнение с помощью проверки параметров или, может быть, просто оставить его в контейнере IoC)?

ответ

0

я не думаю, что есть проблема с дизайном класса

, когда ваш клиентский код необходим объект AnotherClass, чем она будет создавать свои собственные зависимости от ConnectonInfo и работника.

На самом деле существует 2 сценария.

1- Ур ConnectionInfo и работник - это Singletons: в этом случае, если вы создадите объект AnotherClass, чем те же объекты ConnectionInfo и Worker, будет использоваться другим классом.

2- Если точка 1 не соответствует действительности: чем каждый раз, когда вы создаете свой AnotehrClass, Контейнер будет вводить зависимости как свежие объекты.

Но для ConnectionInfo я могу сказать, что это может быть объект Sigleton, потому что это общая информация, которая нужна вашему приложению, поэтому я бы сказал, что сделать ConectionInfo как Singleton, а отдых в порядке, я не думаю, что вы нарушаете любые правила IoC.

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