Автоматический вызов пользовательской функции (для заполнения свойства) при отображении - PullRequest
0 голосов
/ 15 января 2012

У меня есть вид для редактирования конкретного проекта. Вот что я делаю для подготовки модели представления для этого вида:

  1. Получить информацию о проекте
  2. Подготовьте новый объект модели представления и сопоставьте мой проект с ним.
  3. Подготовьте TechnologyString, вызвав функцию для ее заполнения.
  4. Отображение вида.

    public ActionResult Edit(string slug)
    {
        // 1
        Project project = m_ProjectBusiness.GetProject(slug);
    
        // 2
        ProjectEditViewModel viewModel = new ProjectEditViewModel
        {
            ProjectToEdit = Mapper.Map<Project, ProjectFullViewModel>(project)                 
        };
    
        // 3
        viewModel.ProjectToEdit.TechnologyString = m_ProjectBusiness.ListTechnologies(project);
    
        // 4
        return View(viewModel);
    }
    

Как вы можете видеть для пункта 3, я заполняю строку (TechnologyString), расположенную в моей модели представления, под моим объектом ProjectToEdit. Я хотел бы знать, возможно ли выполнить эту операцию напрямую (и автоматически), когда происходит сопоставление?

Спасибо.


EDIT

Я нашел решение, основанное на отображении. Вот оно:

        Mapper.CreateMap<Project, ProjectFullViewModel>()
             .ForMember(dest => dest.TechnologyString,
                        opt => opt.MapFrom(src => String.Join(" ", src.Technologies.Select(x => x.Name))));

Итак, я извлекаю все технологии, прикрепленные к моему проекту, и создаю строку со всеми элементами, разделенными пробелом.

Читатели: Обратите внимание, что приведенное ниже решение Дарина работает в случае, когда технологии не являются частью моей доменной модели. Но в этом случае это так.

1 Ответ

0 голосов
/ 15 января 2012

Это не то, что должно обрабатываться на вашем уровне отображения.Вы можете использовать сервисный уровень, в котором вы будете определять совокупный корень для проекта и технологии:

public class ProjectAggregateRoot
{
    public Project Project { get; set; }
    public string TechnologyString { get; set; }
}

, а затем иметь метод в вашем сервисном слое, который будет возвращать этот агрегированный корень:

public ProjectAggregateRoot GetProjectBySlug(string slug)
{
    var project = _repo.GetProject(slug);
    var technoString = _repo.ListTechnologies(project);
    return new ProjectAggregateRoot
    {
        Project = project,
        TechnologyString = technoString
    }
}

, а затем вы можете напрямую отобразить совокупный корень, который будет возвращен вашим сервисным слоем, и модель представления, например:

public ActionResult Edit(string slug)
{
    var model = _service.GetProjectBySlug(slug);

    // now you have everything in the aggregate root to build your view model
    var viewModel = Mapper.Map<ProjectAggregateRoot, ProjectEditViewModel>(model);
    return View(viewModel);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...