Как создать приложение ASP.Net MVC с EF? - PullRequest
9 голосов
/ 19 октября 2011

У меня возникли небольшие проблемы с концептуализацией того, как создать приложение MVC с Entity Framework в n-уровневом приложении.

Обычное трехуровневое учебное приложение должно выглядеть примерно так:

Доступ к данным-> Бизнес-логика-> Презентация

Презентация не должна ничего знать о доступе к данным. С EF ВСЕ слои должны знать о модели. Так что моя архитектура теперь больше похожа на

Data Access->Business Logic
     |               |
      ---------------
             |
            MVC

Я что-то здесь упускаю или я думаю об этом неправильно?

Должен ли я думать о самом EF как о уровне доступа к данным и помещать сущности в бизнес-логику?

Ответы [ 3 ]

9 голосов
/ 19 октября 2011

Ну, я полагаю, ваш вопрос в том, как спроектировать "слои" в приложении MVC. Взгляните на эту простую архитектуру, я использую ее для своих приложений MVC, и она кажется чистой и эффективной.

  1. проект в решении - бизнес-модель - простая библиотека классов, полная классов POCO, представляющих бизнес-область. Вы можете использовать аннотацию данных здесь, классы метаданных для логики валидации и т. Д.

  2. проект - EF-репозитории - еще одна простая библиотека классов; здесь определен контекст (сначала неплохой код EF, но сначала вы можете использовать базу данных EF или сначала модель - вам просто нужно добавить шаблон POCO T4 в библиотеку классов бизнес-модели, ничего страшного) и набор классов - хранилища

  3. проект - я обычно называю его «ServiceLayer» или около того (я открыт для предложения лучшего имени :) - он содержит только интерфейсы, для репозиториев и других сервисов (реализованных в отдельных проектах), которые будут мои MVC ( или применение любой другой технологии); репозитории из 2.project реализуют эти интерфейсы

  4. проект - сайт MVC. Он использует внедрение зависимостей (сборка в DependencyResolver, и я люблю использовать контейнер Ninject) для отображения репозиториев (и других сервисов); Тогда вы можете использовать инжектор конструктора в контроллеры или какой-нибудь «ленивый» подход (см. Ниже)

Это выглядит примерно так:

Тощий контроллер:

public class SomethingController : BaseController
{
    public ActionResult DoSomething(SomeBusinessThing input)
    {
         if (ModelState.IsValid)
         {
             var result = CustomerRepository.DoSomeBusinessLogicAndPersistenceAndStuff(input);
             return View(result); // you can use AutoMapper here, if you dont want to use business object as viewmodels
         }
    }
}

Мой "репозиторий" наследуется от моего BaseController:

public class BaseController : Controller 
{
    // ... other stuff used by all (or multiple) controllers

    private ICustomerRepository _customerRepository;
        protected ICustomerRepository CustomerRepository
        {
            get
            {
                if (_customerRepository== null)
                    _customerRepository= DependencyResolver.Current.GetService();
                return _customerRepository;
            }
        }
}

Вы можете использовать этот «ленивый» DI, если ваш контроллер использует много сервисов, но только 1-2 на действие, поэтому было бы неэффективно вводить все из них с помощью конструктора. Кто-то может сказать, что вы «скрываете» зависимость таким образом, но если вы храните все это в одном месте - BaseController, это не страшно.

Что ж, внедрение репозитория - это действительно ваше дело. Приложение MVC даже не знает, что вы используете EF, оно знает только интерфейсы сервисов и не заботится о последующей реализации (которую вы можете переключить в любое время позже, если вам нужно!)

Заключение:

  • Контроллеры тонкие - без бизнес-логики

  • Модель FAT - и в этом случае репозитории инкапсулируют всю бизнес-логику (вы также можете использовать другие типы сервисов, например, некоторые калькуляторы для обработки и т. Д., Помните, MVC не заботится, знает только интерфейсы)

  • ViewModels являются входными данными для Views (и ViewModel может быть вашей бизнес-моделью напрямую или вы можете использовать AutoMapper для создания "чистых" ViewModels)

5 голосов
/ 19 октября 2011

Вы можете думать о своих объектах EF как об объектах данных и иметь отдельные модели представления , которые передаются в представления. Данные из ваших EF-объектов можно использовать для заполнения моделей представлений (здесь полезны такие библиотеки, как AutoMapper ). Таким образом, ваши представления никогда не будут иметь прямой зависимости от объектов EF, только от ваших моделей представления.

0 голосов
/ 19 октября 2011

Я могу порекомендовать вам действительно хорошую (как мне кажется) книгу о проектировании доменной архитектуры на платформе .NET. Книга si называется N-многоуровневая архитектура, управляемая доменом, с .NET 4.0. В книге объясняется, как создавать хорошую архитектуру с EF и MVC (и многими другими вещами, такими как Silverlight, IoC с Unity и т. Д.).

Книгу можно скачать по этому адресу:

http://msdn.microsoft.com/es-es/architecture/en/

Также пример приложения очень интересен:

http://microsoftnlayerapp.codeplex.com/

Лучший способ создания сущностей для EF - это создание классов POCO независимо от постоянного уровня. Эти доменные объекты включены в логический уровень домена (бизнеса).

В книге также объясняется, что приложение должно быть разделено на несколько уровней, в них объясняются представления, приложения, домен, инфраструктура (в основном, сохраняемость данных), сквозные и распределенные сервисные уровни.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...