Циркулярные ссылки в моих проектах С#

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

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

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

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

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

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

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

Ответ 1

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

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

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

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

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

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

Ответ 2

скопировать метод ToSlug в проект "Домен" и "Утилита делегирования" ToSlug вызвать этот новый метод

Ответ 3

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

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

Ответ 4

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