Я пробую свои силы на MVC 2, ADO.NET EF и POCO. Я сгенерировал свои классы сущностей в отдельной библиотеке, используя генератор POCO. Эти сущности POCO используются как ViewPages (Не уверен, что это правильный способ проектирования или мне нужны отдельные классы ViewModels?)
Теперь, если я возьму случай простого сценария, в котором мне нужно добавить объект Employee (связанный с мастером отдела), каким тогда должен быть рекомендуемый способ переноса этих объектов между слоями.
Многоуровневая структура приложения выглядит примерно так:
Я думал о различных альтернативах:
У меня есть метод в Контроллере Сотрудника, который называется 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, который снова повторяется и не кажется чистым решением.
Есть ли лучшие способы справиться с этим? Ищете рекомендации и лучшие практики.