Циклические ссылки в моих проектах c#

у меня следующая ситуация:

  1. проект MyCompany.MyProject.Domain который содержит мою модель домена и частичные классы (такие как Contact).

  2. Я хочу "расширить" (частичным классом, а не методом расширения) мой Contact класса Slug который даст мне простой URL-адрес дружественного текстового представления имени и фамилии.

  3. у меня есть метод расширения строки ToSlug() в своем MyCompany.MyProject.Utilities что делает именно то, что я хочу в 2).

  4. проблема: мой Utility проект уже ссылается на мой Domain проект, который означает, что я не могу получить посмотреть Utility проекта ToSlug() метод не вызывает циклическую ссылку.

Я не заинтересован в создании другого проекта для решения этой проблемы, и я действительно хочу сохранить Slug логика общая.

как я могу решить это?

4 ответов


код ссылающиеся MyCompany.MyProject.Domain похоже на запах кода. Я предполагаю, что это утилиты, которые специально работают с объектами домена-если это так, то почему бы вам не включить MyCompany.MyProject.Utilities в своем Domain project (естественно, соответствующим образом изменяя пространство имен)?

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

в вашей конкретной ситуации, однако, рассмотрите возможность введения интерфейса, а именно., INameHolder:

public interface INameHolder
{
    string FirstName { get; set; }
    string LastName { get; set; }
}

затем Contact осуществляет INameHolder. INameHolder существует в другой сборке, назовем ее MyCompany.MyProject.Domain.Interfaces.

иначе Utilities ссылки на проекты Interfaces (не Domain) и Domain, но Interfaces ничего не ссылается-круговая ссылка нарушена.


скопируйте метод ToSlug в проект домена и делегируйте вызов Toslug утилиты этому новому методу


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

или вы можете загрузить логику во время выполнения в домене путем отражения в домене для доступа к зависимой библиотеке. Его не трудно просто ломает проверку времени компиляции.


Если вы уверены в сохранении кода в утилите DLL (ответ Эрика кажется мне умным), то вы можете создать интерфейс в своем проекте утилиты, передать этот интерфейс в качестве параметра вашему методу ToSlug, а затем реализовать интерфейс вашего объекта домена.