Доменный дизайн - Как проверить уникальность одного свойства в доменном объекте
Я разрабатываю приложение с использованием доменного дизайна. Одним из шаблонов, которые я использовал, является шаблон репозитория. Для простоты, скажем, у меня есть следующие классы и интерфейсы.
Car - доменный класс, представляющий концепцию автомобильного домена.
public class Car {
public int Id {get;private set;}
public string SomeUniqueCode {get;private set;}
}
ICarRepository - интерфейс для добавления, удаления или сохранения изменений в объектах Car.
public interface ICarRepository{
Car AddCar(Car c);
void DeleteCar(Car c);
}
Моя проблема в том, как проверить уникальность свойства SomeUniqueCode среди всех объектов Car в базе данных? Это свойство изменяется пользователем (не генерируется автоматически) в любое время в течение жизненного цикла объекта. Конечно, одним из решений было бы поместить уникальный ключ в базу данных, но это не принцип DDD. Я видел шаблон спецификации, используемый для проверки отдельных объектов. Как этот шаблон будет применен к набору объектов Car?
Законно ли, что класс Спецификации (назовем его CheckUniqueCarSpecification) обращается к ICarRepository?
2 ответа
Хранилище имитирует коллекцию в памяти. То, что я использовал раньше, это Contains
метод в отличие от Find
метод, я думаю, вы могли бы либо. Для этого также можно использовать слой запроса. Так же, как у вас есть CarRepository
Вы могли бы иметь CarQuery
, Попытка проверить уникальность в домене несколько досадна. Я бы сделал проверку для удобства, но все же полагаюсь на БД, чтобы вызвать исключение, так как вы должны также обработать этот случай. Использование шаблона спецификации для этого может потребовать больше усилий, чем оно того стоит.
Поскольку хранилище является "коллекцией", я бы не стал Commit
а также Rollback
там.
Используйте DomainService ICarCodesLibrary.
public class Car {
ctor(string someUniqueCode, ICarCodesLibrary codes)
{
// the check
codes.IsValidCode(someUniqueCode)
}
public int Id {get;private set;}
public string SomeUniqueCode {get;private set;}
}
Реализуйте интерфейс в том месте, где вы создаете объект Car и внедряете его. Также избавьтесь от свойств и используйте поля. Идентификатор в порядке, чтобы быть опорой.