Попытка применить принципы DDD к небольшому проекту ... У меня есть PlayerProfile
совокупный корень, который состоит из Club
сущности и коллекции Rating
объектов значений.Периодически мне приходится синхронизировать все сущности PlayerProfile
с внешнего портала, анализируя необработанный HTML.
А сейчас я придумаю решение обернуть код, который обновляет PlayerProfile
в простойPlayerProfileRepository
, что-то вроде этого:
public interface IPlayerProfileRepository
{
Task<IReadOnlyCollection<PlayerProfile>> SyncPlayersProfilesFromPortal(string sourceUrl);
// other methods, which works with data storage
}
Во-первых, мне не очень нравится идея метода смешивания, который работает с хранилищем данных с методами, которые работают с внешним ресурсом (HTML-страницами) дляпериодически создавать PlayerProfile
.Для меня это больше похоже на PlayerProfileFactory
обязанности?
Фактическая реализация IPlayerProfileRepository
делегирует парсинг фактических страниц 3 IPageParser
, который фактически находится в том же слое, что и мои репозитории.Примерно так:
public PlayerProfileRepository(
IPageParser<ParseClubDto> clubPageParser,
IPageParser<ParsePlayerProfileDto> playerProfilePageParser,
IPageParser<ParseRatingDto> ratingPageParser)
{
_playerProfilePageParser = playerProfilePageParser;
_clubPageParser = clubPageParser;
}
Я не совсем уверен, что все эти Dtos
на самом деле Dtos
, как только они используются только с IPageParser
для сохранения промежуточных данных при анализестраницы.Я хотел бы сохранить их близко к IPageParser
реализациям на уровне службы данных, но не делить их в отдельном проекте Dtos и, возможно, назвать по-другому.
После ParseClubDto
, ParsePlayerProfileDto
и ParseRatingDto
, проанализированныхЯ передал его фабричному методу PlayerProfileFactory.Create
, что-то вроде этого:
var playerProfiles = new List<PlayerProfile>();
var clubs = await _clubPageParser.ParseAsync(sourceUrl);
foreach (var club in clubs)
{
var clubPlayers = await _playerProfilePageParser.ParseAsync(club.PlayersPageUrl);
foreach (var clubPlayer in clubPlayers)
{
var ratings = await _ratingPageParser.ParseAsync(clubPlayer.RatingsPageUrl);
playerProfiles.Add(PlayerProfileFactory.Create(club, clubPlayer, ratings));
}
}
return playerProfiles;
После того, как это сделано, я должен выполнить фактическую синхронизацию с существующими корнями агрегирования в БД, что я делаю просто, вызывая ResyncFrom(PlayerProfile profile)
в совокупном корне или это больше похоже на отдельную PlayerProfile
службу домена?
В общем, у меня возникло ощущение, что я делаю что-то не так, поэтому, пожалуйста, любые комментарии приветствуются?