Как я могу перезаписать существующую карту в Automapper - PullRequest
1 голос
/ 08 февраля 2011

Это сводит меня с ума ... Я пытался передать переменную в собственный распознаватель, но это кажется невозможным.

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

Пользовательский резольвер

public class DueDateResolver :  ValueResolver<Task, string>
{

    public string DateFormat = "MMM dd, @ h:mm tt";


    public DueDateResolver(string dateFormat)
    {
        // If no date format is passed use the default
        if (!String.IsNullOrEmpty(dateFormat))
        {
            DateFormat = dateFormat;
        }
    }
}

Контроллер

// <summary>
    /// Ajax Method for filtering tasks by Date Range
    /// </summary>
    /// <param name="dateFilter">The date filter label ["Day", "Week", "Month", "All", "Last 30 Days"]</param>
    /// <returns>List of task objects</returns>
    [HttpGet]
    public JsonResult GetTasksByDateRange(DateFilters dateFilter)
    {
        RegisterMaps.RegisterTaskViewModel(dateFilter.ToString());

        List<Task> tasks = taskService.GetFilteredTasksByDate(dateFilter, "chobojunk@gmail.com");
        List<TaskTableViewModel> viewModelList = Mapper.Map<List<Task>, List<TaskTableViewModel>>(tasks);

        return Json(viewModelList, JsonRequestBehavior.AllowGet);
    }

Отображения

Метод Register () выполняется на уровне global.asa. Другой метод выше вызывается в моем контроллере.

/// <summary>
    /// Special case where I need to pass in a parameter
    /// </summary>
    public static void RegisterTaskViewModel(string dateFilter)
    {
        Mapper.CreateMap<Task, TaskTableViewModel>().ForMember(dest => dest.DueDate,
                                                     opt => opt.ResolveUsing<DueDateResolver>().ConstructedBy(() => new DueDateResolver(dateFilter)));
    }


    public static void Register()
    {
        Mapper.CreateMap<Task, TaskTableViewModel>().ForMember(dest => dest.DueDate,
                                                  opt => opt.ResolveUsing<DueDateResolver>().ConstructedBy(() => new DueDateResolver("")));
}

1 Ответ

0 голосов
/ 22 февраля 2011

Я бы создал отображение один раз и оставил бы его в покое.Создайте объект контекста с вашим параметром резолвера, используйте DI / IoC, чтобы вставить его в резолвер, и обновите его из контроллера перед выполнением преобразователя.

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