Это действительно очень просто, просто загрузите этот модуль:
public class AutoMapperModule : NinjectModule
{
public override void Load()
{
Bind<ITypeMapFactory>().To<TypeMapFactory>();
foreach (var mapper in MapperRegistry.AllMappers())
Bind<IObjectMapper>().ToConstant(mapper);
Bind<Configuration>().ToSelf().InSingletonScope()
.WithConstructorArgument("mappers",
ctx => ctx.Kernel.GetAll<IObjectMapper>());
Bind<IConfiguration>().ToMethod(ctx => ctx.Kernel.Get<Configuration>());
Bind<IConfigurationProvider>().ToMethod(ctx =>
ctx.Kernel.Get<Configuration>());
Bind<IMappingEngine>().To<MappingEngine>();
}
}
Несколько замечаний по этому поводу:
Вместо того, чтобы просто указать MapperRegistry.AllMappers
какаргумент конструктора для Configuration
, он на самом деле идет и связывает каждого отдельного IObjectMapper
, а затем использует само ядро для получения аргументов конструктора в привязке WithConstructorArgument
.Причина этого в том, что вы можете загрузить свои собственные IObjectMapper
привязки в ядро, если решите, что хотите написать свои собственные пользовательские сопоставители.
Причина самосвязывания Configuration
, а затем привязка метода IConfiguration
и IConfigurationProvider
заключается в том, что в отличие от Виндзора, Ninject не предоставляет первоклассную поддержку для привязки нескольких интерфейсов к одной целевой области, отсюда и этот хак.1022 *
Вот и все, что нужно сделать.Напишите свой контейнерный класс с зависимостями на IConfiguration
(если вы хотите создать новые карты) и / или IMappingEngine
(на самом деле для отображения), и Ninject внедрит их без проблем.
Если выЕсли вы хотите использовать сверхслабую связь и иметь каждое сопоставление, определенное в своем собственном классе, то, возможно, вы захотите взглянуть на Расширение соглашений для Ninject, которое может выполнять сканирование сборок, подобное Виндзорскому FromAssembly
.Это также может загрузить любые пользовательские классы IObjectMapper
, которые вы можете определить в отдельной библиотеке.