Как мне использовать AutoMapper с Ninject.Web.Mvc?

Настроить

у меня естьAutoMapperConfiguration статический класс, который устанавливает сопоставления AutoMapper:

static class AutoMapperConfiguration()
{
    internal static void SetupMappings()
    {
        Mapper.CreateMap<long, Category>.ConvertUsing<IdToEntityConverter<Category>>();
    }
}

гдеIdToEntityConverter<T> это обычайITypeConverter это выглядит так:

class IdToEntityConverter<T> : ITypeConverter<long, T> where T : Entity
{
    private readonly IRepository _repo;

    public IdToEntityConverter(IRepository repo)
    {
        _repo = repo;
    }

    public T Convert(ResolutionContext context)
    {
        return _repo.GetSingle<T>(context.SourceValue);
    }
}

IdToEntityConverter занимаетIRepository в своем конструкторе, чтобы преобразовать идентификатор обратно в фактическую сущность, ударив базу данных. Обратите внимание, что у него нет конструктора по умолчанию.

В моем ASP.NETGlobal.asaxэто то, что я имею дляOnApplicationStarted() а такжеCreateKernel():

protected override void OnApplicationStarted()
{
    // stuff that's required by MVC
    AreaRegistration.RegisterAllAreas();
    RegisterRoutes(RouteTable.Routes);

    // our setup stuff
    AutoMapperConfiguration.SetupMappings();
}

protected override IKernel CreateKernel()
{
    var kernel = new StandardKernel();
    kernel.Bind<IRepository>().To<NHibRepository>();

    return kernel;
}

ТакOnApplicationCreated() позвонюAutoMapperConfiguration.SetupMappings() установить сопоставления иCreateKernel() будет связывать экземплярNHibRepository кIRepository интерфейс.

проблема

Всякий раз, когда я запускаю этот код и пытаюсь заставить AutoMapper конвертировать идентификатор категории обратно в сущность категории, я получаюAutoMapperMappingException который говорит, что по умолчанию не существует конструкторIdToEntityConverter.

попытки

Добавлен конструктор по умолчанию дляIdToEntityConverter, Теперь я получаюNullReferenceException, что указывает на то, что инъекция не работает.

Сделал частный_repo поле в публичную собственность и добавил[Inject] приписывать. Все еще получатьNullReferenceException.

Добавил[Inject] атрибут на конструкторе, который принимаетIRepository, Все еще получатьNullReferenceException.

Думая, что, возможно, Ninject не может перехватитьAutoMapperConfiguration.SetupMappings() вызыватьOnApplicationStarted()Я переместил его в то, что, как я знаю, правильно вводит, в один из моих контроллеров, вот так:

public class RepositoryController : Controller
{
    static RepositoryController()
    {
        AutoMapperConfiguration.SetupMappings();
    }
}

Все еще получатьNullReferenceException.

Вопрос

Мой вопрос, как я могу заставить Ninject вводитьIRepository вIdToEntityConverter?

Ответы на вопрос(2)

Ваш ответ на вопрос