【问题标题】:Injecting a collection with Ninject使用 Ninject 注入集合
【发布时间】:2023-12-16 11:54:01
【问题描述】:

假设我有以下课程:

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>>();
     }
}

但是,该集合被注入没有元素。它 not 为 null,但其中根本没有任何元素。不过,ILoggeer 被注入就好了。

【问题讨论】:

    标签: c# .net c#-4.0 dependency-injection ninject


    【解决方案1】:

    对于任何感兴趣的人,Ninject 似乎可以处理同一个接口的多重绑定:

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

    这将作为IPersistenceStrategy&lt;User&gt;[] 注入,然后转换为ICollection&lt;IPersistenceStrategy&lt;User&gt;&gt;

    【讨论】:

    • 您也可以将它们注入为IEnumerable&lt;&gt;IList&lt;&gt;(而不是ICollection)。但是,我不建议使用IEnumerable&lt;&gt;,因为如果您稍后枚举它们(而不是@ctor),它可能会导致意外的副作用。