我在 MVC 控制器操作中有这个非常基本的代码。它将模型类映射Operation
到一个非常基本OperationVM
的视图模型类。
public class OperationVM: Operation
{
public CategoryVM CategoryVM { get; set; }
}
我需要加载完整的类别列表才能创建 CategoryVM 实例。
这是我(尝试)创建一个List<OperationVM>
在视图中显示的方法。
public class OperationsController : Controller {
private SomeContext context = new SomeContext ();
public ViewResult Index()
{
var ops = context.Operations.Include("blah...").ToList();
Mapper.CreateMap<Operation, OperationVM>()
.ForMember(
dest => dest.CategoryVM,
opt => opt.MapFrom(
src => CreateCatVM(src.Category, context.Categories)
// trouble here ----------------^^^^^^^
)
);
var opVMs = ops.Select(op => Mapper.Map<Operation, OperationVM>(op))
.ToList();
return View(opVMs);
}
}
我第一次点击页面时一切都很好。问题是,映射器对象是静态的。因此,在调用 时Mapper.CreateMap()
,当前的实例DbContext
保存在给 CreateMap() 的闭包中。
我第二次点击页面时,静态地图已经到位,仍然使用对初始的引用,现在已处置,DbContext
.
确切的错误是:
The operation cannot be completed because the DbContext has been disposed.
问题是:如何使 AutoMapper 始终使用当前上下文而不是初始上下文?
有没有办法使用自动映射器的“实例”而不是静态Mapper
类?如果可以,是否建议每次都重新创建映射?我担心反射速度变慢。
我阅读了一些关于自定义解析器的信息,但我遇到了类似的问题 - 如何让自定义解析器使用当前上下文?