C# 如何制作AutoMapper在映射时创建的Unity解析模型?

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)

例如,我有以下查询DTO列表并将其映射到viewmodels列表的代码。我想让我的容器解析这些viewmodels,而不是AutoMapper简单地实例化它们而不进行任何注入

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; }
}