MVC + POCO + Entity Framework, передача объекта между слоями - PullRequest
0 голосов
/ 08 марта 2012

Я пробую свои силы на MVC 2, ADO.NET EF и POCO. Я сгенерировал свои классы сущностей в отдельной библиотеке, используя генератор POCO. Эти сущности POCO используются как ViewPages (Не уверен, что это правильный способ проектирования или мне нужны отдельные классы ViewModels?)

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

Многоуровневая структура приложения выглядит примерно так:

enter image description here

Я думал о различных альтернативах:

У меня есть метод в Контроллере Сотрудника, который называется AddEmployee () , который принимает FormCollection в качестве параметра. В коллекции я размещаю такие данные, как имя сотрудника, возраст, зарплата и т. Д., А также идентификатор выбранного отдела.

1.) Одним из способов является создание другого DTO, скажем EmployeeDepartment DTO, который будет использоваться для отображения значений из FormCollection как есть. Затем я могу разбить их на уровне менеджера и использовать их для создания объектов сущности, т. Е. Объекта сотрудника, и ссылаться на отдел по запросу, подобному следующему:

e.Department =  Department.where(i => i.deptId == empDepDto.dept_id).first()

Я не большой поклонник этого и чувствую, что каждый раз, когда возникает какое-либо отношение, я должен добавить DTO и затем сопоставить его с моим классом сущностей.

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

3.) Используйте POCO как есть, создайте объект Employee и объект Deparment на уровне контроллера и передайте объект POCO

public void AddEmployee(FormCollection formCollection)
{
    Department d = new Deparmtent; d.id = ""; //based on the dropdown value
    d.name="" //based on the dropdown selected text;

    Employee e = new Employee; e.Name. e. sal....

    e.Department = d;

    EmployeeManager.AddEmployee(e);
}

Но на уровне менеджера, я думаю, мне все еще нужно воссоздать ссылку на Департамент, используя LINQ, который снова повторяется и не кажется чистым решением.

Есть ли лучшие способы справиться с этим? Ищете рекомендации и лучшие практики.

Ответы [ 2 ]

1 голос
/ 08 марта 2012

Создайте отдельный проект под названием «BusinessObjects» или «Model», который содержит ваши POCO.Затем используйте строго типизированное связывание моделей для MVC, и все будет готово.

Подпись метода будет выглядеть примерно так:

// In your Controller
public void AddEmployee(Employee newObject)
{
      YourDataContext dc = new YourDataContext();
      dc.Employees.Add(newObject);
      dc.SaveChanges();

}
1 голос
/ 08 марта 2012

Во-первых, есть ли причина, по которой вы не используете MVC версии 3?Нет серьезных критических изменений, так что же можно обновить?

Во-вторых, есть ли причина использовать FormCollection, а не строго типизированное связывание моделей?Просто измените ваши представления, чтобы использовать строго типизированные HTML-помощники (например, <%: Html.TextBoxFor(m => m.Property) %>), или убедитесь, что атрибуты name соответствуют именам свойств, и ваш контроллер получит тип, а привязка модели сделает все остальное.Есть множество обучающих программ, показывающих это, и статей, объясняющих это.Привязка модели будет работать с коллекцией имя / значение, например, опубликованной в виде формы, или с данными JSON, или вы можете найти / написать пользовательские привязки модели, которые работают с любым протоколом дурацкой сериализации, который вы хотите.

Одна вещьхотя при передаче фактических типов сущностей, которые будут храниться в Entity Framework, нужно следить за тем, чтобы при обновлении существующих объектов или обращениях к существующим объектам со ссылками на внешние ключи нужно было соблюдать осторожность - все ваши объекты должны быть присоединены к нужному контексту Entity Framework.Чтобы достичь этого, вы часто будете видеть, что объекты, полученные контроллером, копируют свои свойства в только что извлеченную сущность из контекста, либо вручную, либо каким-либо средством отображения объектов.

...