0

Я хотел бы применить принципы проектирования Driven Driven в моем проекте, но не мог определить, что я должен делать с бизнес-логикой зависимых моделей.сложная, многодоменная логика: на уровне обслуживания или в самой модели?

Например, предположим, что этот сценарий:
У меня есть Person и Car модели предметной области. Каждый человек подходит для покупки определенных автомобилей из db в зависимости от возраста/бюджета/предпочтений/и т. Д. В моей модели я хотел бы иметь Список автомобилей (SuitableCars), которые подходят для этого Человека.

public class Person 
{ 
    public List<Car> SuitableCars {get; set;} 
} 

Но для того, чтобы сделать это прямо сейчас, я вызвать метод обслуживания (GetSuitableCarsForPerson) к (DI с репозиторием) выборки данных из БД, запустить мой (иногда довольно сложные мульти-модели зависимый) пользовательской логики и получить автомобили.

public class PersonService : IPersonService 
{ 
    private IRepository _repo; 

    public PersonService(IPRepository repository) 
    { 
     _repo = repository; 
    } 

    public List<Car> GetSuitableCarsForPerson(Person person) 
    { 
     // business goes here right now. 
    } 

} 

Так декларация SuitableCars собственности станет:

private IPersonService _personService; 
public List<Car> SuitableCars 
{ 
    get 
    { 
     // I have to inject a PersonService in my model. Bad practice? 
     return _personService.GetSuitableCarsForPerson(this); 
    } 
} 

AFAIK, услуги должны быть тонкими (ref) и используются, чтобы вы положили Not-DomainModel-Родственный бизнес в них. Но я считаю, что логика, как то, что я описал, принадлежит самой модели.

Итак, как обращаться с такими видами логики, где я должен обращаться к соответствующим моделям и выполнять различные пользовательские проверки/фильтры, чтобы получить соответствующие данные?
Спасибо.

ответ

0

Похоже, что определение набора подходящих автомобилей для человека зависит от факторов вне модели человека и может варьироваться независимо от человека. Набор подходящих автомобилей зависит не только от предпочтений человека, но и от множества всех автомобилей. Набор автомобилей варьируется независимо от человека, и поэтому набор подходящих автомобилей для данного человека является кешем операции, которая определяет набор подходящих автомобилей. Эти наблюдения показывают, что репозиторий или служба домена должны возвращать наборы подходящих автомобилей для человека, а связь между человеком и набором подходящих автомобилей не должна быть выражена непосредственно на модели человека. То, что может быть подходящей ассоциацией для выражения непосредственно на модели человека, - это набор автомобилей, которые человек указал в качестве предпочтительных моделей, поскольку в этом случае человек является «владельцем» этих данных. В DDD приемлемо выражать ассоциации непосредственно в моделях или с использованием репозиториев, а выбор конкретного подхода зависит от нескольких факторов, некоторые из которых изложены выше. Взгляните на this series of articles для углубленного изучения дизайна ваших моделей.

Смежные вопросы