我应该在哪里放置AutoMapper配置?

时间:2018-01-25 11:50:45

标签: c# automapper castle-windsor ioc-container

我有AutoMapper映射,如下所示:

Mapper.Initialize(cfg =>
    {
        cfg.CreateMap<Person, PersonViewModel>();
        cfg.CreateMap<Order, OrderViewModel>();
    });

我试图找出将此代码放在MVC应用程序中的位置。有两种选择:

1)组合根

public class CompositionRoot : IWindsorInstaller
    {
      //Castle Windosr configuration goes here
      //Call to AutoMapper configuration class here
    }

2)Global.asax

这样的问题表明:Where to place AutoMapper.CreateMaps?

我的直觉告诉我把它放在Composition Root中,但是我读到的任何地方都告诉我把它放在Global.asax中。

2 个答案:

答案 0 :(得分:2)

如果您在Application_Start上查看Global.asax。您已经可以看到RouteConfig.RegisterRoutes等内容。这些通常在App_Start文件夹中的类上调用静态方法。我通常使用名为Configure的静态方法添加一个名为AutoMapperConfig的类。然后我将其添加到Gloabl.asax的列表中。见下文:

void Application_Start(object sender, EventArgs e)
{
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
    ModelBindersConfig.Configure();
    DevExpressConfig.Configure();
    AutoMapperConfig.Configure();          
}

答案 1 :(得分:1)

过去我将它们注册为Global.asax的静态调用的一部分。但是,静态Mapper.Map方法已被弃用,所以我最近创建了一个静态类来设置配置映射。然后我在我的应用程序的组合根目录中调用它来注册IMapper对象,然后我可以将其作为任何类中的依赖项。

E.g。

public static class AutoMapperConfig
{
  public static MapperConfiguration ConfigureMapping()
  {
    return new MapperConfiguration(cfg =>
    {
      cfg.CreateMap<Person, PersonViewModel>();
      cfg.CreateMap<Order, OrderViewModel>();
    });
  }
}

使用Castle Windsor,您可以执行以下操作:

container.Register(
  Component.For<IMapper>()
    .UsingFactoryMethod(() => AutoMapperConfig.ConfigureMapping().CreateMapper())
    .LifeStyle.Singleton);