使用automapper和ninject使用DBContext查找创建映射

时间:2014-08-18 11:22:20

标签: c# asp.net-mvc entity-framework ninject automapper

所以我要做的就是使用我的DBContext从数据库中获取一些信息以进行映射。

所以我创建了一个自定义TypeConverter:

public class RoundVMtoTrampetRound : ITypeConverter<RoundVM, TrampetRound>
{

    public RoundVMtoTrampetRound(DBTariff context)
    {
        this.context = context;
    }

    private DBTariff context { get; set; }

    public TrampetRound Convert(ResolutionContext context)
    {
        RoundVM source = (RoundVM)context.SourceValue;
        Mapper.CreateMap<RoundVM, TrampetRound>();
        var dest = Mapper.Map<TrampetRound>(source);
        dest.Difficulty = this.context.DifficultyTrampet.Find(source.Id);
        return dest;
    }
}

在我的控制器中,我使用以下方法创建一个映射器:

Mapper.CreateMap<RoundVM, TrampetRound>().ConvertUsing<RoundVMtoTrampetRound>();

但是当我执行映射时,我收到错误消息,指出没有默认构造函数。但是我希望ninject能够使用代码为我做这个:

kernel.Bind<DBTariff>().ToSelf().InRequestScope();

答案就在这里,但我仍然遇到同样的问题 Automapper + EF4 + ASP.NET MVC - getting 'context disposed' error (I know why, but how to fix it?)

我已经尝试了链接中给出的解决方案,但得到了同样的错误。 那么如何让Automapper使用我的Ninject来解决问题?

修改

我也发现这与autofac做同样的事情 http://thoai-nguyen.blogspot.se/2011/10/autofac-automapper-custom-converter-di.html 所以我的猜测是我需要告诉automapper使用我的ninject解析器但是我该怎么做以及在哪里?

1 个答案:

答案 0 :(得分:1)

您需要的所有信息都在blog article you already linked中提供。 要将其分解为绝对最小信息,您需要执行以下操作:

Mapper.Initialize(x =>
{
     x.ConstructServicesUsing(type => kernel.Get(type));
});

在访问任何其他Mapper.属性/方法之前,您需要在执行Mapper.Initialize(..)之前致电Mapper.CreateMap