AutoMapper 4.2 и Ninject 3.2

Я обновляю мой проект для использования AutoMapper 4.2, и у меня возникают нарушения. Хотя я, кажется, решил изменения, я не совсем уверен, что сделал это наиболее подходящим образом.

В старом коде у меня есть класс NinjectConfiguration и AutoMapperConfiguration, каждый из которых загружается WebActivator. В новой версии AutoMapperConfiguration выпадает, и вместо этого я использую экземпляр MapperConfiguration непосредственно в классе NinjectConfiguration, где происходят привязки:

private static void RegisterServices(
    IKernel kernel) {
    var profiles = AssemblyHelper.GetTypesInheriting<Profile>(Assembly.Load("???.Mappings")).Select(Activator.CreateInstance).Cast<Profile>();
    var config = new MapperConfiguration(
        c => {
            foreach (var profile in profiles) {
                c.AddProfile(profile);
            }
        });

    kernel.Bind<MapperConfiguration>().ToMethod(
        c =>
            config).InSingletonScope();

    kernel.Bind<IMapper>().ToMethod(
        c =>
            config.CreateMapper()).InRequestScope();

    RegisterModules(kernel);
}

Итак, является ли это подходящим способом привязки AutoMapper 4.2 с помощью Ninject? Кажется, он работает до сих пор, но я просто хочу убедиться.

Ответ 1

До того, как интерфейс IMapper не существовал в библиотеке, поэтому вам нужно было реализовать интерфейс и класс ниже и связать их как одноэлементный шаблон.

public interface IMapper
{
    T Map<T>(object objectToMap);
}

public class AutoMapperAdapter : IMapper
{
    public T Map<T>(object objectToMap)
    {
        //Mapper.Map is a static method of the library!
        return Mapper.Map<T>(objectToMap);
    }
}

Теперь вы просто привязываете интерфейс библиотеки IMAPper к одному экземпляру mapperConfiguration.CreateMapper()

Проблема с вашим кодом tho, вы должны использовать один экземпляр (или как Ninject говорит, константа) bind.

// A reminder
var config = new MapperConfiguration(
    c => {
        foreach (var profile in profiles) {
            c.AddProfile(profile);
        }
    });
// Solution starts here
var mapper = config.CreateMapper();
kernel.Bind<IMapper>().ToConstant(mapper);