2015-12-11 5 views
0

Я начал использовать Ninject сегодня, потому что Structuremap позволил мне долгое время.Ninject Multiple Type Constructor

Я столкнулся с проблемой, когда начал регистрировать те же типы с теми же интерфейсами, но я назвал их (как показано ниже).

kernel.Bind<IDataContextAsync>().To<DbGeoContext>().InRequestScope().Named("DbGeoContext"); 
kernel.Bind<IDataContextAsync>().To<DbEspContext>().InRequestScope().Named("DbEspContext"); 

IParameter geoUnitOfWorkDbContext = new ConstructorArgument("dataContext", kernel.Get<IDataContextAsync>("DbGeoContext")); 
IParameter espUnitOfWorkDbContext = new ConstructorArgument("dataContext", kernel.Get<IDataContextAsync>("DbEspContext")); 

kernel.Bind<IUnitOfWorkAsync>().To<UnitOfWork>().Named("UnitOfWorkGeoContext").WithConstructorArgument(geoUnitOfWorkDbContext); 
kernel.Bind<IUnitOfWorkAsync>().To<UnitOfWork>().Named("UnitOfWorkEspContext").WithConstructorArgument(espUnitOfWorkDbContext); 

**Fails here with: Error activating IDataContextAsync 

более одного совпадения привязки доступны **

вар t1 = kernel.Get ("UnitOfWorkGeoContext"). var t2 = kernel.Get ("UnitOfWorkEspContext");

Может кто-нибудь помочь мне выяснить, что здесь происходит и как это исправить?

Я понимаю, что во время выполнения Ninject не сможет определить, какой экземпляр для инъекции, но я, хотя это было для экземпляров «Именованных»?

Благодаря

+0

Возможный дубликат [Интерфейс с несколькими реализациями в Ninject] (http://stackoverflow.com/questions/19119591/ interface-with-multiple-implementationations-in-ninject) –

+0

Конструктор должен иметь атрибут «Named» –

+0

Привет. Это не дубликат из-за того, что я пытаюсь достичь l логики привязки в методе RegisterService. Я не хочу включать библиотеку ninject в свой слой репозитория. – Csharper

ответ

0

При использовании Ninject таргетинг на несколько реализаций одного и того же интерфейса, что вам нужно сделать это с .Named вызова, как вы сделали. Но вам также нужно добавить атрибут Named на конструкторе, чтобы Ninject знал, какую реализацию нужно решить.

Как показано здесь:

https://github.com/ninject/ninject/wiki/Contextual-Binding#simple-constrained-resolution-named-bindings

Пример

class SomeClassThatConsumesOneOfYourImplementations 
{ 
    public SomeClassThatConsumesOneOfYourImplementations(
     [Named("DbGeoContext")] IDataContextAsync context) 
    { 
     // Constructor logic... 
    } 
}