Мисля, че приложението ми трябва да има поне следните слоеве:
- DAL (няма общ интерфейс; вземете данните от база данни, вземете данните от друга уеб услуга, вземете данните от файл)
- Хранилище (CRUD интерфейс за всеки важен/основен агрегат; реализациите варират според източника)
- Услуга (използва интерфейс на хранилище; реализациите варират според бизнес логиката)
- Уеб API (услуги за обвиване; контейнер за инсталиране; реализациите варират според параметрите/конфигурацията по време на изпълнение)
Знам, че моят уеб API трябва да връща DTO, който интерпретирам като C# обекти с нищо друго освен автоматично внедрени публични свойства.
На теория понякога ще трябва да направя BigComplicatedServiceCommand
, където ще има множество хранилища, участващи в една единица работа, но друг път моят уеб API може също така да извика хранилището директно, защото то просто прави CRUD.
Интересувам се да разбера къде трябва да се извърши картографирането от (въведено в уеб услуга чрез обвързване на уеб api модел) DTO към каквото Услугата изисква - и също така къде трябва да се извърши валидирането.
Грубо казано, имам това в ума си:
В API
- Получаване на заявка и карта за маршрут
- Използвайте свързващо устройство на модела, за да се свържете с DTO по конвенция
- Създайте конкретен контролер с помощта на IoC контейнер
- Изпълнете конкретно действие на контролера
- В действието на контролера, обвийте слоя на повикване към услуга
Сега, след като стъпка 5 е проблематична. Изпращам ли DTO на сервиза? Тогава моята услуга ще бъде съчетана с моите DTO.
Трябва ли да дефинирам конкретен интерфейс за всеки метод на услуга? Ако е така, те всъщност са техни собствени DTO и бих могъл да дефинирам DTO за пермутация на въвеждане на услуга.
Ако приемем, че моята услуга включва DTO,
- В метода на услугата правете бизнес логика и правете повиквания към хранилища
- В хранилища, CRUD неща
- Връща крайния резултат от метода на услугата към API
- Прехвърляне към DTO и връщане от API към Интернет
Сега, трябва ли моите хранилища да се занимават стриктно с обекти на домейн? Ако е така, кой отговаря за кастинга? (Услугата?)
И накрая, имайки предвид валидирането, си мисля:
- Валидирайте предварително, като използвате едно от следните:
ModelStateActionFilter
(преди изпълнение на действие), по време на кастинг към всичко, което услугата трябва да приеме като вход. Така че това би гарантирало, чеCreateUserService
получава обект сUsername
иPassword
. - Уверете се, че потребителското име е уникално и паролата е достатъчно силна, като използвате хранилища и други услуги
- Валидирайте на ниво DAL, за да сте сигурни, че Entity Framework е щастлив
Въпросът ми е върху кои (ако има такива) обекти трябва да поставя System.DataAnnotations
? Има ли някакъв тип модел в този стек, който трябва да отговаря в която и да е част за собственото си валидиране?
Благодаря за всякаква философска помощ.