Одной из стратегий является внедрение службы, которая может проверять ограничение.
public interface IWebsiteUniquenessValidator
{
bool IsWebsiteUnique(string websiteUrl);
}
Затем вам придется реализовать это, то, как вы это сделаете, будет зависеть от факторов, которых я не знаю, но я предлагаю не беспокоиться о прохождении домена. Сделайте это просто, это всего лишь запрос (* - я добавлю к этому внизу).
public class WebsiteUniquenessValidator : IWebsiteUniquenessValidator
{
//.....
}
Затем «введите» его в метод, где это необходимо. Я говорю «внедрить», потому что мы предоставим его объекту домена извне домена, но .. мы сделаем это с параметром метода, а не с параметром конструктора (чтобы избежать необходимости создания экземпляров наших сущностей нашим контейнером IoC ).
public class User
{
public void AddWebsite(string websiteUrl, IWebsiteUniquenessValidator uniquenessValidator)
{
if (!uniquenessValidator.IsWebsiteUnique(websiteUrl) {
throw new ValidationException(...);
}
//....
}
}
Независимо от того, кто является вашим пользователем и его репозиторием - если это класс Service или CommandHandler - может обеспечить эту зависимость для проверки уникальности. Этот потребитель должен быть подключен через IoC, так как он будет использовать UserRepository:
public class UserService
{
private readonly IUserRepository _repo;
private readonly IWebsiteUniquenessValidator _validator;
public UserService(IUserRepository repo, IWebsiteUniquenessValidator validator)
{
_repo = repo;
_validator = validator;
}
public Result AddWebsiteToUser(Guid userId, string websiteUrl)
{
try {
var user = _repo.Get(userId);
user.AddWebsite(websiteUrl, _validator);
}
catch (AggregateNotFoundException ex) {
//....
}
catch (ValidationException ex) {
//....
}
}
}
* Я упомянул упрощение проверки и обход домена.
Мы создаем домены для инкапсуляции часто сложного поведения, связанного с изменением данных.
Как показывает опыт, требования к изменению данных сильно отличаются от требований к запросу данных.
Это похоже на болевую точку, которую вы испытываете, потому что вы пытаетесь заставить чтение пройти систему записи.
Можно отделить чтение данных от Домена со стороны записи, чтобы облегчить эти болевые точки.
CQRS - название, данное этой технике. Я просто скажу, что целая куча лампочек щелкнула, когда я просмотрел DDD в контексте CQRS. Я настоятельно рекомендую попытаться понять концепции CQRS.