我在 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类?如果可以,是否建议每次都重新创建映射?我担心反射速度变慢。
我阅读了一些关于自定义解析器的信息,但我遇到了类似的问题 - 如何让自定义解析器使用当前上下文?