如何让 Unity 解析 AutoMapper 在映射时创建的模型?

How can I make Unity resolve models that AutoMapper creates when mapping?

我有以下代码查询 DTO 列表,并将其映射到视图模型列表。我想让我的容器解析这些视图模型,而不是 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);
}

感谢 this answer,我找到了一种简洁且相当可靠的方法来实现我想要的。主要过程如下所示:

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

和工厂:

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

剩下的就是提供容器未解析的 ctor 参数,但这在我的此模式用例中不是必需的。