Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在ASP.NET MVC应用程序中在Global.asax级别配置最新版本的AutoMapper_C#_Asp.net Mvc_Automapper - Fatal编程技术网

C# 在ASP.NET MVC应用程序中在Global.asax级别配置最新版本的AutoMapper

C# 在ASP.NET MVC应用程序中在Global.asax级别配置最新版本的AutoMapper,c#,asp.net-mvc,automapper,C#,Asp.net Mvc,Automapper,我正在试图弄清楚如何在Global.asax级别配置新的AutoMapper 我以前用老AutoMapper做过以下操作: var config = new MapperConfiguration(cfg => { cfg.CreateMap<Product, ProductDto>(); cfg.CreateMap<ApplicationUser, UserDto>(); }); 在App_Start文件夹中创

我正在试图弄清楚如何在Global.asax级别配置新的AutoMapper

我以前用老AutoMapper做过以下操作:

    var config = new MapperConfiguration(cfg =>
    {
       cfg.CreateMap<Product, ProductDto>();
       cfg.CreateMap<ApplicationUser, UserDto>();
    });
在App_Start文件夹中创建一个名为MappingProfile.cs的类,然后在构造函数中添加映射,如下所示:

public MappingProfile()
{
     Mapper.CreateMap<Product, ProductDto>();
     Mapper.CreateMap<ApplicationUser, UserDto>();
}
var foo = _mapper.Map<ProductDto>(someProduct);
publicmappingprofile()
{
CreateMap();
CreateMap();
}
然后在Global.asax中调用:

Mapper.Initialize(cfg => cfg.AddProfile<MappingProfile>());
Mapper.Initialize(cfg=>cfg.AddProfile());
有人能告诉我如何实现上述与新版本的AutoMapper?我一直在看文件,但似乎看不懂

我相信我在MappingProfile.cs文件中会这样做:

    var config = new MapperConfiguration(cfg =>
    {
       cfg.CreateMap<Product, ProductDto>();
       cfg.CreateMap<ApplicationUser, UserDto>();
    });
var config=new-MapperConfiguration(cfg=>
{
CreateMap();
CreateMap();
});
但是如何处理配置变量呢?

我就是这样做的

public abstract class AutoMapperBase
{
    protected readonly IMapper _mapper;

    protected AutoMapperBase()
    {
        var config = new MapperConfiguration(x =>
        {
            x.CreateMap<Product, ProductDto>();
            x.CreateMap<ApplicationUser, UserDto>();
        });

        _mapper = config.CreateMapper();
    }
}
公共抽象类AutoMapperBase
{
受保护的只读映像映射器;
受保护的AutoMapperBase()
{
var config=新的MapperConfiguration(x=>
{
x、 CreateMap();
x、 CreateMap();
});
_mapper=config.CreateMapper();
}
}
然后从需要使用AutoMapperBase的任何类继承AutoMapperBase,并按如下方式调用它:

public MappingProfile()
{
     Mapper.CreateMap<Product, ProductDto>();
     Mapper.CreateMap<ApplicationUser, UserDto>();
}
var foo = _mapper.Map<ProductDto>(someProduct);
var foo=\u mapper.Map(someProduct);

您不再需要在全局中声明或配置它。asax需要执行以下操作:

Mapper.Initialize(cfg =>
{
    cfg.CreateMissingTypeMaps = true;
    cfg.AddProfile<MappingProfile>();
});
Mapper.Initialize(cfg=>
{
cfg.CreateMissingTypeMaps=true;
AddProfile();
});
这将配置旧AutoMapper中公开的静态映射器实例,以便您可以执行以下操作:

Mapper.Map<SomeType>(fromObject);
Mapper.Map(fromObject);
如果不想使用静态实例,则需要查看IntoNET答案

“CreateMissingTypeMaps”行确保“动态”创建缺少的映射。它相当于旧的:

Mapper.DynamicMap<SomeType>(fromObject)
Mapper.DynamicMap(fromObject)
如果要手动定义每个映射,可以删除此行

有一个版本的AutoMapper,作者出于某种原因试图去除暴露在外的静电,但据我所知,在公众强烈抗议后,他把它带了回来。所以现在你可以用任何你认为合适的方式来做。您可以在此处阅读:


你看过这篇博文了吗?是的,我读了这篇博文和新的AutoMapper文档,没有直接的例子说明我应该在Global.Asax中调用什么以及如何创建MapperProfile类。这些文档太简短了。我只是想学习如何使用AutoMapper,三天之后,我仍然不知道如何使用它。一轮又一轮的反对并没有帮助。好吧,我创建了你的AutoMapperBase类,现在在ApicController中,如果该类已经从ApicController继承,我该如何使用它。只允许通过接口进行多重继承。您可以将此代码移出类并移入控制器类的构造函数,或者从AutoMapperBase继承ApicController。在后一种情况下,我会将AutoMapperBase重命名为AutoMapperApiControllerBase或更明显的用法。这样做有意义吗?似乎他们希望您为每个文件中的每个特定场景初始化它。这真是一种痛苦,为什么会变得更好?他们在文档中推荐了什么?我更喜欢。就我个人而言,我发现它比隐藏在global.asax文件中更明显。但这就是你具体问题的答案。我明白了,我同意你回答得很好。然而,你说使用Mapper没有什么错。在所有情况下,动态初始化然后调用Mapper.Map?好的,我使用的是最新和最好的版本5.02。因此,不必为每个特定用例在每个文件中重新配置映射。我如何在应用程序启动时进行所有配置,然后在必要时在代码中调用Mapper.Map?@BlakeRivell我的答案就在这里。定义配置文件,然后使用Initialize方法注册它们。将代码放在global.asax中,您应该能够在代码中的任何位置使用Mapper.Map。基本上,调用Initialize方法可以配置静态公开的IMapper实例上的映射。我明白你的意思,因此我可以简单地使用名为GenerateMappings的静态方法创建一个类,我将在global.asax文件中调用该方法。在GenerateMappings中,我会调用Mapper.Initialize,然后在我的所有文件中调用Mapper.Map。这有意义吗?@BlakeRivell说得对。事实上,这正是我们在代码中所做的…:)明白了,要么就是这样,要么直接在global.asax中调用Initialize,对吗?