使用Automapper将服务结果映射到视图模型

Tyl*_*ght 1 asp.net-mvc domain-driven-design automapper

我正在尝试将服务结果映射到特定的视图模型.我有一个名为Category的实体,其中包含Id和Name.我通过存储库ICategoryRepository公开它.我有一个服务IInfrastructureService使用类别存储库GetAllCategories.GetAllCategories返回一个IList.在我的MVC项目中.我有一个名为NavigationController的控制器.此控制器需要调用GetAllCategories服务.我想将此结果映射到这样的结构:

public class CategoryViewModel {
    public Guid CategoryId { get; set; }
    public string Name { get; set; }
}

public class CategoryMenuViewModel {
    public IList<CategoryViewModel> Categories { get; set; }
    public CategoryViewModel SelectedCategory { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我想用Automapper来做这件事.在我的Application_Start()中,我创建了地图:

Mapper.CreateMap<Category, CategoryViewModel>();
Run Code Online (Sandbox Code Playgroud)

然后在我的控制器中:

public ViewResult CategoryMenu()
{
    CategoryMenuViewModel viewModel = new CategoryMenuViewModel();
    Mapper.CreateMap<Category, CategoryViewModel>();
    viewModel.Categories = Mapper.Map<IList<Category>, IList<CategoryViewModel>>(_infrastructureService.GetAllCategories());
    return View(viewModel);
}
Run Code Online (Sandbox Code Playgroud)

这给了我这个例外:程序集中的重复类型名称.

我不确定我在这里做错了什么.任何帮助或指导都会摇滚!

Dar*_*rov 5

你为什么要Mapper.CreateMap在控制器里面打电话?这应该只在AppDomain的整个生命周期内调用一次,最好是在Application_Start.在控制器内部,您Mapper.Map只能调用该方法.

获得异常的原因是因为您已经在Application_Start中的Category和CategoryViewModel之间定义了一个映射(.CreateMap).所以:

public ViewResult CategoryMenu()
{
    var categories = _infrastructureService.GetAllCategories();
    CategoryMenuViewModel viewModel = new CategoryMenuViewModel();
    viewModel.Categories = Mapper.Map<IList<Category>, IList<CategoryViewModel>>(categories);
    return View(viewModel);
}
Run Code Online (Sandbox Code Playgroud)