Циркулярные ссылки в моих проектах С#
У меня следующая ситуация:
-
Проект 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, а затем объект домена реализует интерфейс.