C# 我应该把AutoMapper配置放在哪里?

C# 我应该把AutoMapper配置放在哪里?,c#,automapper,castle-windsor,ioc-container,C#,Automapper,Castle Windsor,Ioc Container,我有自动映射,如下所示: Mapper.Initialize(cfg => { cfg.CreateMap<Person, PersonViewModel>(); cfg.CreateMap<Order, OrderViewModel>(); }); 2) Global.asax 类似这样的问题表明: 我的直觉告诉我把它放在合成根目录中,但是我读到的任何地方都告诉我把它放在Global.asax中。如果你在应用程序开

我有自动映射,如下所示:

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

类似这样的问题表明:


我的直觉告诉我把它放在合成根目录中,但是我读到的任何地方都告诉我把它放在Global.asax中。

如果你在应用程序开始时查看Global.asax。您已经可以看到RouteConfig.RegisterRoutes等内容。这些通常调用App_Start文件夹中类的静态方法。我通常添加一个名为AutoMapperConfig的类和一个名为Configure的静态方法。然后我将其添加到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();          
}

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

例如

公共静态类AutoMapperConfig
{
公共静态映射配置ConfigureMapping()
{
返回新的MapperConfiguration(cfg=>
{
CreateMap();
CreateMap();
});
}
}
使用Castle Windsor,您可以执行以下操作:

container.Register(
  Component.For<IMapper>()
    .UsingFactoryMethod(() => AutoMapperConfig.ConfigureMapping().CreateMapper())
    .LifeStyle.Singleton);
container.Register(
用于()的组件
.UsingFactoryMethod(()=>AutoMapperConfig.ConfigureMapping().CreateMapper())
(1,生活方式,单身人士),;

我不相信AutoMapperConfig类会编译。它应该包含一个方法吗?我可以问一下,为什么像其他回答者一样使用Composition Root而不是Global.asax吗?谢谢。正如答案开头提到的,这样我就可以在DI容器中注册
IMapper
类。这消除了对静态Mapper.Map调用的依赖性(在Automapper 5中已经过时),从而使测试等变得更容易。
public static class AutoMapperConfig
{
  public static MapperConfiguration ConfigureMapping()
  {
    return new MapperConfiguration(cfg =>
    {
      cfg.CreateMap<Person, PersonViewModel>();
      cfg.CreateMap<Order, OrderViewModel>();
    });
  }
}
container.Register(
  Component.For<IMapper>()
    .UsingFactoryMethod(() => AutoMapperConfig.ConfigureMapping().CreateMapper())
    .LifeStyle.Singleton);