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, что и выдаст циркулярную зависимость и соответствующий эксепшн.
Момент по репозиториям. Их трогать не нужно. Они возвращают сущности = строки из бд.
Рефакторить нужно в бизнес логики. Но что нужно сделать именно? Желательно примеры с кодом.