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

Setup

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

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

где IdToEntityConverter - это пользовательский 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.NET Global.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 не существует конструктора по умолчанию.

Попытки

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

  2. Сделал частное поле _repo общедоступным свойством и добавил [Inject ] атрибут. По-прежнему получаю NullReferenceException .

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

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

     открытый класс RepositoryController: Controller
    {
     статический RepositoryController ()
     {
     AutoMapperConfiguration.SetupMappings ();
     }
    }
    

    По-прежнему получаю NullReferenceException .

Вопрос

Мой вопрос: как заставить Ninject внедрить IRepository в IdToEntityConverter ?

]
12
задан Daniel T. 2 November 2010 в 02:54
поделиться