4

Я создаю проект с Asp.net MVC 5, Web Api 2 и Entity Framework. Я проектирую его с помощью архитектуры Onion, поэтому у меня есть слои DAL, Service и UI.MVC Onion architecture, некоторые вопросы

Мой слой DAL содержит UnitOfWork и репозитории, мой сервисный уровень содержит службы для бизнес-кейсов.

Но у меня есть следующие вопросы:

  1. Где использовать единицы работы сохранить (или совершающие) метод ?, в слое услуг или в слое пользовательского интерфейса? , если я использую его на уровне служб, как мне обращаться с случаями, которые охватывают несколько служб?

  2. Я использую DTO для операций webapi, должен ли слой служб возвращать DTO или сопоставление должно выполняться в слое пользовательского интерфейса?

  3. Должны ли DTO находиться в отдельном проекте или в проекте пользовательского интерфейса? Если они находятся в отдельном проекте, я должен использовать атрибуты MVC для проверки?

+1

Хранилище на вершине EF плохо, mkaaaay? –

+0

Я не думаю, что OP конкретно говорит, что он настроен. –

+6

@Sippy Если у вас когда-либо был менеджер/архитектор, изменивший его/ее разум в середине проекта о вашей технологии доступа к данным, вы знаете, что у вас есть уровень абстракции над вашей инфраструктурой доступа к данным. Таким образом, нет, репозитории поверх EF (или любой ORM) не плохи, если они инкапсулируют ORM. –

ответ

6

Ваше подразделение должно существовать в вашем сервисном слое. Каждый вызов службы содержит бизнес-транзакцию внутри одной единицы работы.

public ServiceResponse<Patient> Save(Patient patient, string userName) 
    { 
     Func<Patient> func = delegate 
     { 
      Authorize(patient, userName); 
      Validate(patient, new PatientValidator()); 

      using (var context = _contextFactory()) 
      { 
       return context.Save(patient, userName); 
      } 
     }; 
     return this.Execute(func); 
    } 

слой услуги должны вернуть бизнес-объекты, любое отображение для целей сети связи/JSON форматирование должно быть сделано в Web API. Это позволяет максимально повторное использование ваших услуг.

Если по DTO вы ссылаетесь на объекты, которые вы используете для сериализации wire/json, то они должны оставаться в том же проекте, что и Web Api. Это может быть или не быть тем же проектом, где у вас есть свой пользовательский интерфейс. Если вы используете Web Api, я рекомендую использовать библиотеку проверки, например FluentValidation.

Пример Луковых архитектур https://github.com/carbonrobot/FullStackEF с использованием C#, EF, Web Api

+0

Спасибо, еще один вопрос, почему вы завершаете все функции сохранения в делегате? – Escobar5

+2

Так что у меня есть одна попытка ... поймать для всех методов и вернуть стандартный отформатированный объект ответа.Он делает звонки от клиента, такие как WebApi, намного чище, и вы можете обрабатывать ответ с помощью общих методов. В этом случае ... улов может также регистрироваться. Поскольку все операции происходят внутри этого метода, все ошибки будут пойманы, зарегистрированы и обработаны. –

+0

Я бы добавил, что ваши бизнес-объекты - это не то же самое, что и ваши модели Entity Framework. http://blog.8thlight.com/uncle-bob/2013/10/01/Dance-You-Imps.html –

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