C# 如何制作AutoMapper在映射时创建的Unity解析模型?
例如,我有以下查询DTO列表并将其映射到viewmodels列表的代码。我想让我的容器解析这些viewmodels,而不是AutoMapper简单地实例化它们而不进行任何注入C# 如何制作AutoMapper在映射时创建的Unity解析模型?,c#,automapper,unity-container,C#,Automapper,Unity Container,例如,我有以下查询DTO列表并将其映射到viewmodels列表的代码。我想让我的容器解析这些viewmodels,而不是AutoMapper简单地实例化它们而不进行任何注入 using (var db = new AppDbContext()) { var types = await db.ApptTypes .Where(t => t.BranchId == branchId && (includeDeleted || !t.IsDeleted)
using (var db = new AppDbContext())
{
var types = await db.ApptTypes
.Where(t => t.BranchId == branchId && (includeDeleted || !t.IsDeleted))
.Include(e => e.CreatedBy)
.Include(e => e.CreatedAt)
.Include(e => e.Org)
.Include(e => e.Branch)
.ToListAsync(cancellationToken);
return Mapper.Map<IEnumerable<ApptTypeDetailViewModel>>(types);
}
使用(var db=new AppDbContext())
{
var types=await db.ApptTypes
其中(t=>t.BranchId==BranchId&&(包括删除| | | t.IsDeleted))
.Include(e=>e.CreatedBy)
.Include(e=>e.CreatedAt)
.Include(e=>e.Org)
.包括(e=>e.Branch)
.ToListSync(取消令牌);
返回Mapper.Map(类型);
}
多亏了,我找到了一种简洁且相当可靠的方法来实现我想要的。主要流程如下所示:
class Program
{
private static IUnityContainer _container;
static void Main(string[] args)
{
var boot = new Bootstrapper();
boot.Run();
_container = boot.Container;
InitMaps(_container);
var dto = new Dto {Id = 418, Name = "Abrahadabra"};
var model = Mapper.Map<ViewModel>(dto);
}
private static void InitMaps(IUnityContainer container)
{
Mapper.Initialize(cfg =>
{
cfg.CreateMap<Dto, ViewModel>()
.ConstructUsing(f => UnityObjectFactoty.GetInstance<ViewModel>(container));
});
}
}
剩下的就是提供容器未解析的ctor参数,但在我的这个模式的用例中,这不是一个要求。有趣的想法。使用AutoMapper新的(er)基于实例的映射,您可以注入所需的映射配置。虽然我认为问题在于目标类型必须在编译时已知。@GertArnold目标类型在编译时已知,但我只需要找到一种方法告诉AutoMapper如何实例化它,我不明白你说的我想让我的容器解析这些视图模型是什么意思。这不是视图模型类型的运行时解析吗?@GertArnold是的,它是viewmodels的运行时解析,但AutoMapper只调用默认的ctor,而不调用
容器。Resolve
来实例化viewmodels。我已经找到了一些信息,可能很快就会有答案。顺便说一下,AutoMapper是运行时实例化,那么为什么不使用运行时解析>
class UnityObjectFactoty
{
public static TObject GetInstance<TObject>(IUnityContainer container)
{
return container.Resolve<TObject>();
}
}
public class ViewModel
{
public ViewModel(IService service)
{
_service = service;
}
private IService _service;
public int Id { get; set; }
public string Name { get; set; }
}