как справиться с этой круговой зависимостью? - PullRequest
0 голосов
/ 24 апреля 2018

У меня есть решение MyApp.Это решение имеет проект Services и проект Repositories (DAL).Шаблон приложения состоит в том, что каждая служба вызывает соответствующий репозиторий для доступа к данным.

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

В качестве обходного пути я могу просто вызвать LoggingRepository напрямую, а не вызывать службу,Есть ли лучший способ справиться с этой круговой зависимостью?

1 Ответ

0 голосов
/ 24 апреля 2018

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

  • ILoggingService
  • LoggingService и я бы также сделали это для каждого отдельного boundedContext, который представляет группу проектов, которые имеют дело с одним аспектом внутри моего домена (например, операции студентов и логика внутришкольное приложение, ищите шаблон проектирования на основе домена для получения дополнительной информации) следующим образом:

  • IStudentsDomain

  • StudentsDomain

И позволяетпредставьте, что у нас есть другие репозитории и ограниченный контекст, называемые Учителями, представленные в следующих проектах следующим образом:

  • ITeachersDomain
  • TeachersDomain

Теперь вы имеете в виду толькоILoggingService внутри StudentsDomain и TeachersDomain (реализация DAL oна уровне домена) и используйте внедрение зависимостей (на основе вашего проекта для asp.net mvc я бы порекомендовал Unity, внутри ядра asp.net mvc DI уже существует "из коробки", и, наконец, вы также можете использовать Unity в WPF)чтобы зарегистрировать ваши интерфейсы в их реализации, а затем запросить их внутри конструктора StudentsDomain и TeachersDomain следующим образом:

public class TeachersDomain : ITeachersDomain
{
    public ILoggingService LoggingService { get; set; }
    public TeachersDomain(ILoggingService loggingService)
    {
        LoggingService = loggingService;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...