Примеры конфигурации для Structure Map и Windsor: http://www.cprieto.com/index.php/2009/08/20/using-automapper-with-castle-windsor/
Но я ничего не нашел для Ninject.
Вы знаете, как перевести эти сопоставления в Ninject?
Примеры конфигурации для Structure Map и Windsor: http://www.cprieto.com/index.php/2009/08/20/using-automapper-with-castle-windsor/
Но я ничего не нашел для Ninject.
Вы знаете, как перевести эти сопоставления в Ninject?
Это действительно очень просто, просто загрузите этот модуль:
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
заключается в том, что, в отличие от Windsor, Ninject не предоставляет никакой первоклассной поддержки для привязки нескольких интерфейсов к одной целевой области, отсюда и этот хак.
Вот и все. Напишите свой класс-контейнер с зависимостями от IConfiguration
(если вы хотите создавать новые карты) и/или IMappingEngine
(для фактического отображения), и Ninject внедрит их без проблем.
Если вы хотите использовать сверхслабую связь и определить каждое сопоставление в своем собственном классе, вам, вероятно, следует взглянуть на Conventions Extension для Ninject, который может выполнять сканирование сборки аналогично FromAssembly
Windsor. Это также может загружать любые пользовательские IObjectMapper
классы, которые вы можете определить в отдельной библиотеке.
Configuration
на ConfigurationStore
? Я думаю, что это единственное значимое изменение в v2; он реализует тот же интерфейс IConfiguration
и принимает те же аргументы конструктора, что и Configuration
в v1.
- person Aaronaught; 14.06.2012
Profile
тоже присутствует. Прямо сейчас у меня есть набор из них, обнаруженный через Ninject.Extensions.Conventions
, который я затем загружаю в Mapper.Initialize()
. Вероятно, я вернусь, когда мне понадобится инъекция в конвертер/форматер/как бы он ни назывался. Надеясь, что @jbogard может выпустить каноническую статью и/или обновить параграф или два о том, как/какие из новых абстракций v2 подходят к DI, прежде чем это станет критическим. Анализировал декомпилятором; нужно прочитать тесты (по крайней мере, если это лучший способ понять Ninject). А пока спасибо за ваш ответ и этот ответ.
- person Ruben Bartelink; 14.06.2012
IMapRegistration
и запустил все реализующие классы при запуске. Все они берут IProfileExpression
(все еще часть v2 API) в ctor, а затем я написал метод расширения с именем WithProfile
для IBindingWithSyntax<IMapRegistration>
, который просто создает профиль, используя WithConstructorArgument
и вызывая метод CreateProfile
для сохраняющего контекст IConfiguration
get. Как-то муторно, но есть.
- person Aaronaught; 14.06.2012
IMapRegistration
, поэтому я решил использовать его напрямую. Я думаю, если бы у вас было время превратить свою технику в хороший, и вот как я это делаю с Ответ AM 2.0, чтобы сидеть рядом с этим, это было бы очень полезно :P А пока спасибо за то, что поделились соответствующими подробностями.
- person Ruben Bartelink; 14.06.2012