我想知道是否有一种方法可以在使用依赖注入时全局配置Mapster?
配置选项似乎适用于静态使用,也仅适用于单例模式。
我创建了一个扩展方法。
// Extension method
public static IServiceCollection AddMapster(this IServiceCollection services, Action<TypeAdapterConfig> options = null)
{
var config = new TypeAdapterConfig();
config.Scan(Assembly.GetAssembly(typeof(Startup)));
options?.Invoke(config);
services.AddSingleton(config);
services.AddScoped<IMapper, ServiceMapper>();
return services;
}
// Called in Startup.ConfigureServices(IServiceCollection services)
services.AddMapster(options =>
{
options.Default.IgnoreNonMapped(true); // Does not work.
TypeAdapterConfig.GlobalSettings.Default.IgnoreNonMapped(true); // Does not work.
});
Run Code Online (Sandbox Code Playgroud)
我想这些不起作用,因为它们ServiceMapper正在创建自己的实例而不使用我配置的任何内容。
我想通过使用以下语句在两个类之间进行映射:
var directoryDataModel = new DirectoryDM()
{
Title = "School Directory",
Persons = new List<PersonDM>()
{
new TeacherDM() { Name = "Johnson", Department = "Math" },
new StudentDM() { Name = "Billy", Classes = new List<string>() { "Math", "Physics" } }
}
};
var directoryViewModel = directoryDataModel.Adapt<DirectoryVM>();
var directoryDataModel2 = directoryViewModel.Adapt<DirectoryDM>();
Run Code Online (Sandbox Code Playgroud)
我需要做什么才能处理 Persons 列表中派生类的映射?
TeacherVM <=> TeacherDM 和 StudentVM <=> StudentDM
数据模型:
public class DirectoryDM
{
public string Title;
public List<PersonDM> Persons;
}
public class PersonDM
{
public string Name; …Run Code Online (Sandbox Code Playgroud) 我有一个 ASP.NET Core 项目 (netcoreapp2.0),它引用类库项目 (netstandard2.0) 中的模型。我正在尝试使用 Mapster 来映射存储在类库中的对象。Mapster 的文档说使用以下代码从 Startup.cs 调用 Scan 方法:
TypeAdapterConfig.GlobalSettings.Scan(assembly1, assembly2, assemblyN)
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是如何最好地获取类库的程序集引用以传递给 Scan 方法。我认为这更像是一个一般的 .NET 问题,而不是特定于 Mapster 的问题。我能想到的最好的是以下内容,但感觉很尴尬。
private Assembly GetAssemblyByName(string name)
{
var assemblies = Assembly.GetEntryAssembly().GetReferencedAssemblies();
var assemblyName = assemblies.FirstOrDefault(i => i.Name == name);
var assembly = Assembly.Load(assemblyName);
return assembly;
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来处理这个问题?
更新:显然我上面的解决方案破坏了代码优先迁移。任何人都可以建议一种方法来实现这一目标吗?
我有一个 .Net 5 Web Api 项目并想使用
地图大师 v7.2.0
以避免手动映射对象。以下代码显示了示例场景
。
[ApiController]
[Route("[controller]")]
public class MyController : ControllerBase
{
[HttpGet]
public ActionResult<UsernameWithTodoTitle> Get()
{
TypeAdapterConfig<(User, Todo), UsernameWithTodoTitle>
.NewConfig()
.Map(dest => dest, src => src.Item1) // map everything from user
.Map(dest => dest, src => src.Item2) // map everything from todo
.Map(dest => dest.TodoTitle, src => src.Item2.Title); // map the special fields from todo
var user = new User { Username = "foo", FieldFromUser = "x" };
var todo …Run Code Online (Sandbox Code Playgroud) 我正在使用 Mapster 将 Dto 实例映射到 Model 对象。
Dto 由 Javascript 客户端发送,仅发送更新的属性。
我想忽略空值,并让 Mapster 对此属性保留模型实例不变。
一个简化的示例可以更好地解释该场景:
// My .Net Dto class, used for client/server communication.
public class PersonDto
{
public string Id { get; set; }
public string Name { get; set; }
public string Family { get; set; }
}
// My Model class. Let's assume is the same data as per the Dto.
public class Person
{
public string Id { get; set; }
public string Name { get; …Run Code Online (Sandbox Code Playgroud) 我来这里是因为我在网上找不到答案:/
我想测试我的 Mapster 配置以避免在开发时发生错误映射。但我不知道如何使用 Mapster lib 来实现它。
有什么线索吗?
问候,
我在 Visual Studio 中使用 Mapster 和 C#,并且需要将三个对象映射到一个对象。有人这样做过吗,有例子吗?Mapster 说它有这种能力,但我无法让它工作。谢谢。
我将 Mapster 与 DI 结合使用,并尝试映射从 WS 收到的对象。我正在遵循本指南https://github.com/MapsterMapper/Mapster/wiki/Dependency-Injection#mapping
我注册了TypeAdapterConfig和ServiceMapper
var config = new TypeAdapterConfig();
services.AddSingleton(config);
services.AddScoped<IMapper, ServiceMapper>();
Run Code Online (Sandbox Code Playgroud)
黑名单类包含卡片集合,但 Web 服务返回长数组,我将其重新映射到对象。
public class BlacklistMapper : IRegister
{
void IRegister.Register(TypeAdapterConfig config)
{
config.NewConfig<long, Internal.BlacklistCard>()
.Map(dest => dest.Cuid, source => source);
config.NewConfig<SzWebService.BlackList, Internal.Blacklist>()
.Map(dest => dest.Id, source => source.iBlacklistId)
.Map(dest => dest.Crc, source => source.iBlackListCRC)
.Map(dest => dest.Cards, source => source.lCuid);
}
}
Run Code Online (Sandbox Code Playgroud)
在构造函数中注入映射器
private readonly IMapper _mapper;
public Service(IMapper mapper)
{
_logger = logger;
}
Run Code Online (Sandbox Code Playgroud)
最后像这样称呼它
_mapper.Map<Blacklist>(response.mBlackListData)
Run Code Online (Sandbox Code Playgroud)
结果始终是具有默认值的对象
我正在尝试学习Mapster。我有这样的课程
class In
{
public string A;
public string B;
public string C;
}
class Out
{
public Sub Sub;
public string C;
}
class Sub
{
public string A;
public string B;
public Sub(string a, string b)
=>(A,B) = (a,b);
}
Run Code Online (Sandbox Code Playgroud)
创建配置:
var mapper = new Mapper();
mapper.Config
.ForType<In, Out>()
.Map(@out => @out.C, @in=> @in.C)
.Map(@out=> @out.Sub, @in => new Sub(@in.A, @in.B));
Run Code Online (Sandbox Code Playgroud)
现在,如果我尝试映射对象 - 一切都可以,但是如果我向Sub类添加第二个构造函数
class Sub
{
public string A;
public string B;
public Sub(string a, …Run Code Online (Sandbox Code Playgroud) mapster ×9
c# ×7
.net ×3
.net-core ×2
mapping ×2
.net-5 ×1
.net-6.0 ×1
asp.net-core ×1
mapper ×1
unit-testing ×1