如何让 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 参数,但这在我的此模式用例中不是必需的。
我有以下代码查询 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 参数,但这在我的此模式用例中不是必需的。