2017年6月19日 星期一

【AutoMapper】None static centralized configuration

想把 AutoMapper 的設定作個集中,但找到的教學都是用 Initialize 做靜態的,而沒有新版建議的 IMapper 實體導向的作法,參考了 SO 得其中一篇作了簡單的設置,算不上 best practice 但有興趣的人還是可以參考下。

Configuration class
public class AutoMapperWebConfiguration
{
    public static MapperConfiguration Configure()
    {
        return new MapperConfiguration(cfg =>
        {
            cfg.AddProfile(new MeetingProfile());
            cfg.AddProfile(new ClubProfile());
        });
    }
}

Profile 範例
public class ClubProfile : Profile
{
    public ClubProfile()
    {
        CreateMap<ClubViewModel, Club>();
        CreateMap<Club, ClubViewModel>()
            .ForMember(dest => dest.DisplayText, opt => opt.ResolveUsing(src =>
            {
                if (string.IsNullOrEmpty(src.ChineseAbbr))
                {
                    return $"{src.Name}({src.Abbr})";
                }
                else
                {
                    return $"{src.ChineseAbbr}({,src.Abbr})";
                }
            }));
    }
}
相對於使用前直接建 config,套用 Profile 的話,官方建議在其初始化時做 CreateMap()。
以上兩個我是開一個 AutoMapper 資料夾裝一起,不太確定最佳實作應該是怎麼做。

然後在 Global.asax 讓程式跑起來的時候把設定一併帶起來。
public class MvcApplication : System.Web.HttpApplication
{
    internal static MapperConfiguration MapperConfig { get; set; }

    protected void Application_Start()
    {
        // skip

        MapperConfig = AutoMapperWebConfiguration.Configure();
    }
}

在 Controller 就有 mapper 可以建來用了
public class MeetingsController : Controller
{
    private IMapper _mapper = MvcApplication.MapperConfig.CreateMapper();

    // GET: Meetings
    public ActionResult Index()
    {
        // skip
    }
}

ref:SO

沒有留言:

張貼留言