"CreateMap"语句应该放在哪里?

Jon*_*han 11 asp.net-mvc mvvm separation-of-concerns automapper

我经常使用AutoMapper将模型(域)对象映射到ViewModel对象,然后由我的视图以模型/视图/视图模型模式使用.

这涉及许多"Mapper.CreateMap"语句,这些语句都必须执行,但只能在应用程序的生命周期中执行一次.

从技术上讲,我应该将它们全部保存在某个静态方法中,从我的Application_Start()方法调用它(这是一个ASP.NET MVC应用程序).

但是,在一个中心位置将许多不同的映射问题组合在一起似乎是错误的.

特别是当映射代码变得复杂并涉及格式化和其他逻辑时.

是否有更好的方法来组织映射代码,使其与所关注的ViewModel保持接近?

(我提出了一个想法 - 在每个ViewModel上有一个'CreateMappings'方法,在BaseViewModel中,在实例化时调用此方法.但是,由于该方法只应在应用程序生命周期中调用一次,因此需要一些额外的逻辑缓存已调用CreateMappings方法的ViewModel类型列表,然后仅在必要时为不在该列表中的ViewModel调用它.)

Buh*_*ica 7

如果你真的不想使用引导程序,那么至少一个静态构造函数是确保最多调用一次CreateMap的简单方法.(与Jonathon的回答相比,没有更少的麻烦和更多的线程证明.)

public class AccountController : Controller 
{
    static AccountController()
    {
        Mapper.CreateMap<Models.User, ViewModels.UserProfile>();
        Mapper.CreateMap<Models.User, ViewModels.ChangePassword>();
    }
}
Run Code Online (Sandbox Code Playgroud)


Jim*_*ard 3

如果您使用配置文件,则可以将所有“CreateMap”调用放在那里。此外,您可以创建一个包含您的配置的静态引导程序类,并让启动部分仅调用引导程序。