Круговая зависимость от СУХОЙ - PullRequest
6 голосов
/ 08 марта 2009

Я разрабатываю библиотеку классов многократного использования, которая содержит 2 сборки (среди прочих) с именами core.xml.dll и core.string.dll.

Сборка xml ссылается на сборку строк, чтобы использовать некоторые вспомогательные методы.

Однако теперь есть строковый метод, в котором было бы полезно использовать метод, содержащийся в сборке xml.

Если я буду ссылаться на сборку xml из сборки строк, я создам циклическую зависимость и не смогу построить обе сборки из исходного кода. (т.е. проблема курицы и яйца).

Чтобы следовать принципу «Не повторяйся», я бы хотел избежать дублирования функций в обеих сборках. Если я обнаружил ошибку в реализации, я хочу исправить ее только в одном месте.

Хотя я мог бы объединить сборки в одну, это не идеал, так как это снижает связность сборки.

Мне нужно пересобрать и развернуть всю сборку только для небольшого изменения в определенном классе. Кроме того, в конечном итоге, с таким количеством зависимостей, я, вероятно, получу одну огромную библиотечную сборку.

Так что в контексте повторно используемого набора библиотечных сборок, какой лучший подход использовать здесь? Кроме того, как сама платформа .NET справляется с этой проблемой?

(В Reflector кажется, что System.Configuration.dll ссылается на System.XML.DLL и наоборот. Действительно ли это правильно, если да, то как управляется циклическая зависимость?)

Ответы [ 4 ]

6 голосов
/ 08 марта 2009

Согласен с ножами. Круговые зависимости - это дизайнерский запах. Рефакторинг это безжалостно!

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

Псевдо C ++ Пример:

class Employee {
    Company company;
};

class Company {
    vector<Employee> employees;
};

Хитрый? Не обязательно:

template<class CompanyT>
class Employee {
    CompanyT company;
};

class Company {
    vector<Employee<Company> > employees;
};

Больше примитивных типов, которые должны зависеть от более высокого уровня, можно абстрагировать для работы с любым другим типом, если он выполняет свои контракты.

3 голосов
/ 08 марта 2009

Если вашей библиотеке String действительно нужна ваша библиотека XML, это, вероятно, указывает на то, что ваша библиотека String должна быть реорганизована в определение типа данных более низкого уровня и «основные утилиты» (без внешних зависимостей, если это возможно) и другое высокоуровневая библиотека, которая может содержать XML, SQL, регулярные выражения или все, что вы считаете полезным на прикладном уровне.

3 голосов
/ 08 марта 2009

Сделайте это методом расширения, который определен в сборке xml (на основе вашего комментария «метод преобразования, который принимает XML и преобразует в формат на основе строки»). Это касается XML. Так же, как Linq для IEnumerable.

3 голосов
/ 08 марта 2009

Похоже, вам нужна третья сборка ...

...