2015-06-30 2 views
0

Давайте предположим, что у меня есть следующий класс:Инъекционной коллекции с Ninject

public class AsyncEntityManager<E> : EntityManager<E>, IAsyncEntityManager<E> 
     where E : IPersistableEntity 
{ 
    public AsyncEntityManager(ICollection<IPersistenceStrategy<E>> strategies, ILogger logger) : base(strategies, logger) { } 
} 

Как я могу вводить сбор в этом случае?

Это то, что я пробовал:

internal class PersistenceModule : ApplicationModule 
{ 
    public override void Load() 
    { 
      Kernel.Bind<ICollection<IPersistenceStrategy<User>>>().ToMethod(c => new IPersistenceStrategy<User>[] { 
       (IPersistenceStrategy<User>)c.Kernel.GetService(typeof(DynamoDBStrategy<User>)) 
      }); 

      Kernel.Bind<IAsyncEntityManager<User>>().To<AsyncEntityManager<User>>(); 
    } 
} 

Однако сбор впрыскивается без каких-либо элементов. Это не null, но в нем нет никаких элементов. То есть ILoggeer, тем не менее, впрыскивается очень хорошо.

ответ

0

Для тех, кто заинтересован, он кажется Ninject может обрабатывать multipible привязок тот же интерфейс:

Kernel.Bind<IPersistenceStrategy<User>>().To<DynamoDBStrategy<User>>(); 
Kernel.Bind<IPersistenceStrategy<User>>().To<SQLServerStrategy<User>>(); 

Это будет впрыскивается в качестве IPersistenceStrategy<User>[], который затем литым к ICollection<IPersistenceStrategy<User>>

+0

Вы можете также их закачиваемой как 'IEnumerable <>' или как 'IList <>' (не как 'ICollection'). Однако я бы не рекомендовал использовать 'IEnumerable <>', потому что это может привести к непреднамеренным побочным эффектам, если вы перечислите их позже (а не @ctor). – BatteryBackupUnit

Смежные вопросы