Как подключить контроллер к сервисному слою и к хранилищу - PullRequest
3 голосов
/ 27 октября 2010

Допустим, у меня есть следующие объекты, которые отображаются в таблицы базы данных (каждое соответствующее имя свойства может рассматриваться как отношение PK / FK):

public class Person
{
  public int PersonID { get; set; }
  public string FirstName { get; set; }
  public string LastName { get; set; }
}

public class Employee
{
  public int EmployeeID { get; set; }
  public int PersonID { get; set; }
  public int Salary { get; set; }
}

public class Executive
{
  public int ExecutiveID { get; set; }
  public int EmployeeID { get; set; }
  public string OfficeNumber { get; set; }
}

public class Contact
{
  public int ContactID { get; set; }
  public int PersonID { get; set; }
  public string PhoneNumber { get; set; }
}

Моя архитектура выглядит следующим образом: Контроллер вызовы Сервис уровень, который вызывает Репозиторий уровень.

У меня есть вид с именем AddExecutive, который собирает следующую информацию: FirstName, LastName, PhoneNumber, Salary и OfficeNumber.

Каков наилучший способ передать эти данные, учитывая мою архитектуру? Я думаю, что я бы опубликовал ViewModel, который содержит всю собранную мной информацию, и передал бы ее методу Service AddExecutive(AddExecutiveViewModel addExecutiveViewModel), затем в методе Service я создал бы новые экземпляры Person, Employee, Executive, и Contact и прикрепил бы передать их друг другу (Person объект) и передать ВСЕ данные в метод репозитория AddExecutive(Person person). Затем метод Repository просто фиксирует данные. Это звучит правильно? Что было бы лучшим решением?

Ответы [ 2 ]

2 голосов
/ 27 октября 2010

Пока вы поддерживаете разделение забот, вы хороши.Контроллер: привязывает данные к сервису / модели. Сервис: внедряет бизнес-логику, передает устойчивость Repo. Репо: выполняет ACID-транзакции и запросы.

Если ваша модель представления отделена от каких-либо проблем структуры (например, POCO), выдолжно быть хорошо, так как вы поддерживаете тестируемость.

0 голосов
/ 27 октября 2010

Когда вы говорите о фиксации данных, вы говорите о единице работы. Итак, начните там:

public ActionResult AddExecutive(AddExecutiveViewModel addExecutiveViewModel)
{ 
    // simplified; no error handling
    using (var uow = new UnitOfWork()) // or use constructor injection on the controller...
    {
        // ???
        uow.Commit();
    }
    return RedirectToAction(// ...
}

Теперь ваши сервисы выходят из единицы работы (потому что и единица работы, и репозитории имеют в фоновом режиме ObjectContext; ObjectContext является "родной" единицей работы EF). Таким образом, мы можем заполнить // ???:

public ActionResult AddExecutive(AddExecutiveViewModel model)
{ 
    // simplified; no error handling
    using (var uow = new UnitOfWork()) // or use constructor injection on the controller...
    {
        uow.EmployeeService.AddExecutive(model);
        uow.Commit();
    }
    return RedirectToAction(// ...
}

uow.Commit() - это тонкая оболочка вокруг ObjectContext.SaveChanges(). Единица работы вводится с тем же ObjectContext, что и хранилища. Услуги EF-невежественны.

Рабочий пример (хотя и на ранней стадии) см. В моем проекте с открытым исходным кодом для репозитория / службы, Halfpipe .

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