我是。net的新手,所以我决定使用。net Core,而不是学习“老方法”。我在这里找到了一篇关于为。net Core设置AutoMapper的详细文章,但是对于新手来说还有更简单的操作指南吗?
当前回答
关于这个问题的答案, 不需要在控制器构造函数中指定IMapper映射器参数。
您可以使用Mapper,因为它是代码任何位置的静态成员。
public class UserController : Controller {
public someMethod()
{
Mapper.Map<User, UserDto>(user);
}
}
其他回答
使用ASP使用AutoMapper。净的核心。
步骤1。从NuGet包中安装AutoMapper.Extensions.Microsoft.DependencyInjection。
步骤2。在“解决方案”中创建一个文件夹以保存名称为“Mappings”的映射。
步骤3。添加映射文件夹后,我们添加了一个名为“MappingProfile”的类,这个名称可以是唯一的,很好理解。
在本课程中,我们将维护所有映射。
步骤4。在启动“ConfigureServices”时初始化映射器
在启动类,我们需要初始化配置文件,我们已经创建和注册AutoMapper服务。
Mapper.Initialize(cfg => cfg.AddProfile<MappingProfile>());
services.AddAutoMapper();
显示ConfigureServices方法的代码片段,其中我们需要初始化和注册AutoMapper。
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
// Start Registering and Initializing AutoMapper
Mapper.Initialize(cfg => cfg.AddProfile<MappingProfile>());
services.AddAutoMapper();
// End Registering and Initializing AutoMapper
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}}
第5步。得到的输出。
为了获得映射结果,我们需要调用AutoMapper.Mapper.Map并传递正确的目的地和源。
AutoMapper.Mapper.Map<Destination>(source);
CodeSnippet
[HttpPost]
public void Post([FromBody] SchemeMasterViewModel schemeMaster)
{
if (ModelState.IsValid)
{
var mappedresult = AutoMapper.Mapper.Map<SchemeMaster>(schemeMaster);
}
}
关于这个问题的答案, 不需要在控制器构造函数中指定IMapper映射器参数。
您可以使用Mapper,因为它是代码任何位置的静态成员。
public class UserController : Controller {
public someMethod()
{
Mapper.Map<User, UserDto>(user);
}
}
Asp。Net Core 2.2与AutoMapper.Extensions.Microsoft.DependencyInjection。
public class MappingProfile : Profile
{
public MappingProfile()
{
CreateMap<Domain, DomainDto>();
}
}
在Startup.cs
services.AddAutoMapper(typeof(List.Handler));
对于使用。net 7的AutoMapper 11.0.1,我开始得到这个异常:
System.ArgumentException: 'GenericArguments[0], 'System.DateTime', on 'T MaxInteger[T](System.Collections.Generic.IEnumerable`1[T])' violates the constraint of type 'T'.'
Inner Exception
VerificationException: Method System.Linq.Enumerable.MaxInteger: type argument 'System.DateTime' violates the constraint of type parameter 'T'.
看这个问题:
系统。DateTime on 'T MaxInteger[T](System.Collections.Generic.IEnumerable ' 1[T])'违反了。net 7使用AutoMapper 11.0.1的T类型约束
这意味着我不能再使用services.AddAutoMapper(typeof(MappingProfile).Assembly);无一例外。
对于AutoMapper.Extensions.Microsoft.DependencyInjection我这样解决它:
services.AddAutoMapper(cfg => cfg.Internal().MethodMappingEnabled = false, typeof(MappingProfile).Assembly);
对于Blazor WebAssembly客户端,解决方案是这样的:
var mapperConfig = new MapperConfiguration(mc =>
{
//Needed for https://github.com/AutoMapper/AutoMapper/issues/3988
mc.Internal().MethodMappingEnabled = false;
mc.AddProfile(new MappingProfile());
});
//mapperConfig.AssertConfigurationIsValid();
IMapper mapper = mapperConfig.CreateMapper();
builder.Services.AddSingleton(mapper);
我使用的是AutoMapper 6.1.1和asp.net Core 1.1.2。
首先,定义由Automapper的Profile Class继承的Profile类。我创建了IProfile接口,该接口为空,目的只是为了查找该类型的类。
public class UserProfile : Profile, IProfile
{
public UserProfile()
{
CreateMap<User, UserModel>();
CreateMap<UserModel, User>();
}
}
现在创建一个单独的类,例如Mappings
public class Mappings
{
public static void RegisterMappings()
{
var all =
Assembly
.GetEntryAssembly()
.GetReferencedAssemblies()
.Select(Assembly.Load)
.SelectMany(x => x.DefinedTypes)
.Where(type => typeof(IProfile).GetTypeInfo().IsAssignableFrom(type.AsType()));
foreach (var ti in all)
{
var t = ti.AsType();
if (t.Equals(typeof(IProfile)))
{
Mapper.Initialize(cfg =>
{
cfg.AddProfiles(t); // Initialise each Profile classe
});
}
}
}
}
现在在MVC核心web项目的Startup.cs文件中,在构造函数中,调用Mapping类,它将在应用程序时初始化所有映射 装载。
Mappings.RegisterMappings();