Dapper и Service Repository Pattern и Circular Dependencies

Всем привет. Итак, сразу расскажу о своей архитектуре в приложении.

Слой DAL.
Используется micro orm Dapper. Для каждой таблицы создан отдельный репозиторий.
Все репозитории простые и возвращают простые сущности (без связей). Сущность я называю - строка в базе данных.

Модель - проекция из нескольких сущностей (строк в бд), со своим поведением. И так, у меня есть следующая модель User (упростил для примера)

public class User
{
    int Id {get;}
    string Name {get;}
    int Age {get;}
    Country Country {get;}
}

Далее есть модель Country

public class Country
{
    int Id {get;}
    string Name {get;}
}

Так как у меня репозитории возвращают только строки из бд, то для создания данной модели User, я использую службу UserService:

public class UserService : IUserService
{
    IUserRepository _userRepository;
    ICountryService _countryService;
    public UserService(IUserRepository userRepository, ICountryService countryService)
    {
        this._userRepository = userRepository;
        this._countryService= countryService;
    }

    public User GetUserById(int userId)
    {
        var userEntity = _userRepository.FindById(userId);
        var countryModel = _countryService.GetById(userEntity.country_id);
    
        return new User(userEntity, countryModel);
    }
}

В целом, все отлично. Далее создается таким же образом CountryService, чей код довольно простой

public class CountryService : ICountryService
{
    ICountryRepository _countryRepository;
    public CountryService(ICountryRepository countryRepository)
    {
        this._countryRepository = countryRepository;
    }

    public Country GetCountryById(int countryId)
    { 
        var countryEntity = _countryRepository.FindById(countryId);
        return new Country(countryEntity);
    }
}

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

Момент по репозиториям. Их трогать не нужно. Они возвращают сущности = строки из бд.
Рефакторить нужно в бизнес логики. Но что нужно сделать именно? Желательно примеры с кодом.


Ответы (0 шт):