Циклические ссылки в моих проектах c#
у меня следующая ситуация:
проект
MyCompany.MyProject.Domain
который содержит мою модель домена и частичные классы (такие какContact
).Я хочу "расширить" (частичным классом, а не методом расширения) мой
Contact
классаSlug
который даст мне простой URL-адрес дружественного текстового представления имени и фамилии.у меня есть метод расширения строки
ToSlug()
в своемMyCompany.MyProject.Utilities
что делает именно то, что я хочу в 2).проблема: мой
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
ничего не ссылается-круговая ссылка нарушена.
Если вы не можете поделиться доменом (возможно, правильно), и он должен потреблять логику из общей библиотеки, тогда вам действительно нужно ввести другую сборку.
или вы можете загрузить логику во время выполнения в домене путем отражения в домене для доступа к зависимой библиотеке. Его не трудно просто ломает проверку времени компиляции.
Если вы уверены в сохранении кода в утилите DLL (ответ Эрика кажется мне умным), то вы можете создать интерфейс в своем проекте утилиты, передать этот интерфейс в качестве параметра вашему методу ToSlug, а затем реализовать интерфейс вашего объекта домена.