我是。net的新手,所以我决定使用。net Core,而不是学习“老方法”。我在这里找到了一篇关于为。net Core设置AutoMapper的详细文章,但是对于新手来说还有更简单的操作指南吗?
当前回答
services.AddAutoMapper ();对我没用。(我用的是Asp。Net Core 2.0)
配置如下
var config = new AutoMapper.MapperConfiguration(cfg =>
{
cfg.CreateMap<ClientCustomer, Models.Customer>();
});
初始化映射器 IMapper mapper = config.CreateMapper();
并将mapper对象作为单例添加到服务中 services.AddSingleton(映射);
这样我就可以添加DI到控制器
private IMapper autoMapper = null;
public VerifyController(IMapper mapper)
{
autoMapper = mapper;
}
我在我的动作方法中使用了如下
ClientCustomer customerObj = autoMapper.Map<ClientCustomer>(customer);
其他回答
我用这种方式解决了它(类似于上面,但我觉得这是一个更干净的解决方案)。net Core 3.x
创建MappingProfile.cs类并使用Maps填充构造函数(我计划使用一个类来保存所有映射)
public class MappingProfile : Profile
{
public MappingProfile()
{
CreateMap<Source, Dest>().ReverseMap();
}
}
在Startup.cs中,添加下面的内容以添加到DI(程序集参数用于保存映射配置的类,在我的例子中,它是MappingProfile类)。
//add automapper DI
services.AddAutoMapper(typeof(MappingProfile));
在Controller中,像使用其他DI对象一样使用它
[Route("api/[controller]")]
[ApiController]
public class AnyController : ControllerBase
{
private readonly IMapper _mapper;
public AnyController(IMapper mapper)
{
_mapper = mapper;
}
public IActionResult Get(int id)
{
var entity = repository.Get(id);
var dto = _mapper.Map<Dest>(entity);
return Ok(dto);
}
}
theutz的回答很好,我只想补充一点:
如果你让你的映射配置文件继承自MapperConfigurationExpression而不是profile,你可以非常简单地添加一个测试来验证你的映射设置,这总是很方便:
[Fact]
public void MappingProfile_VerifyMappings()
{
var mappingProfile = new MappingProfile();
var config = new MapperConfiguration(mappingProfile);
var mapper = new Mapper(config);
(mapper as IMapper).ConfigurationProvider.AssertConfigurationIsValid();
}
services.AddAutoMapper ();对我没用。(我用的是Asp。Net Core 2.0)
配置如下
var config = new AutoMapper.MapperConfiguration(cfg =>
{
cfg.CreateMap<ClientCustomer, Models.Customer>();
});
初始化映射器 IMapper mapper = config.CreateMapper();
并将mapper对象作为单例添加到服务中 services.AddSingleton(映射);
这样我就可以添加DI到控制器
private IMapper autoMapper = null;
public VerifyController(IMapper mapper)
{
autoMapper = mapper;
}
我在我的动作方法中使用了如下
ClientCustomer customerObj = autoMapper.Map<ClientCustomer>(customer);
在。net 6中,你需要在Program.cs文件中添加以下内容:
builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
我想扩展@theutz的答案-即这一行:
// services.AddAutoMapper(typeof(Startup)); // <-- newer automapper version uses this signature.
AutoMapper.Extensions.Microsoft.DependencyInjection版本3.2.0中有一个错误(可能)。(我使用的是。net Core 2.0)
这个问题在这个GitHub问题中解决。如果你继承AutoMapper的Profile类存在于你的Startup类所在的程序集之外,如果你的AutoMapper注入是这样的,它们可能不会被注册:
services.AddAutoMapper();
除非您显式指定要搜索AutoMapper概要文件的程序集。
在你的初创公司中也可以这样做。ConfigureServices:
services.AddAutoMapper(<assembies> or <type_in_assemblies>);
其中"assemblies"和"type_in_assemblies"指向应用程序中指定Profile类的程序集。例句:
services.AddAutoMapper(typeof(ProfileInOtherAssembly), typeof(ProfileInYetAnotherAssembly));
我认为(我强调这个词)由于以下无参数重载的实现(来自GitHub的源代码):
public static IServiceCollection AddAutoMapper(this IServiceCollection services)
{
return services.AddAutoMapper(null, AppDomain.CurrentDomain.GetAssemblies());
}
我们依赖于CLR已经包含AutoMapper配置文件的JITed程序集,这可能是真的,也可能不是真的,因为它们只在需要时被jit(更多细节在这个StackOverflow问题中)。
推荐文章
- 随机字符串生成器返回相同的字符串
- 为什么Func<T,bool>而不是Predicate<T>?
- .NET中的Map和Reduce
- 我如何能使一个组合框不可编辑的。net ?
- .NET反射的成本有多高?
- 实体框架回滚并移除不良迁移
- 将流转换为字符串并返回
- 在c#中检查字符串是否只包含数字的最快方法
- IEquatable和重写Object.Equals()之间的区别是什么?
- 创建一个堆栈大小为默认值50倍的线程有什么危险?
- 转换JSON字符串到JSON对象c#
- 显示两个datetime值之间的小时差值
- 如何设置enum为空
- 选择Enum类型的默认值而无需更改值
- 我如何设置在一个组合框中选择的项目,以匹配我的字符串使用c# ?