Dependency injection 如何在集合表单中注入依赖项?

Dependency injection 如何在集合表单中注入依赖项?,dependency-injection,inversion-of-control,ninject,Dependency Injection,Inversion Of Control,Ninject,如果依赖项是以集合的形式存在,如何关联依赖项 例如: public class Ninja { public List<IShuriken> Shurikens {get;set;} public IKatana Katana {get;set;} public void Attack() { // some code goes here to use weapons and kill people } } 公共级忍者{ 公共列表Shurikens{get;set;} 公共

如果依赖项是以集合的形式存在,如何关联依赖项

例如:

public class Ninja {

public List<IShuriken> Shurikens {get;set;}
public IKatana Katana {get;set;}

public void Attack()
{
  // some code goes here to use weapons and kill people
}
}
公共级忍者{
公共列表Shurikens{get;set;}
公共IKatana Katana{get;set;}
公开无效攻击()
{
//有些代码是用来使用武器和杀人的
}
}
在这种情况下,如何使用Ninject这样的容器


编辑:我不是专门谈论Ninject,但这是我使用最多的DI/IOC。:)

我不知道Ninject的事。在中,您将使用
ListResolver
,这将提供Autofac中
IShuriken

的所有实现。您将使用IEnumerable构造函数依赖项:

public class Ninja {

  public Ninja(IEnumerable<IShuriken> shurikens, IKatana katana)
  {
    // ...
  }
公共级忍者{
公共忍者(Inumerable shurikens,IKatana katana)
{
// ...
}

Autofac将找到任何可用的shurikens并自动提供给构造函数。

您可以
绑定
一个封闭类型
列表
到constant()
到method()

但你必须提供更多的细节,说明你想要什么,否则我就只是在空想你到底想要什么

编辑以回应您和您的评论:如果您处理的是“未知”或松散的依赖关系,那么会朝这个方向做很多事情

[通常使用DI]如果您在内部做一些事情,并且这是一种更“已知”的/固定的/复杂的解决机制,那么最好通过拥有一个存储库或其他协调对象来建模这样的事情,该对象将管理您可以根据需要请求的列表子集和/或其他投影

[如果你对Niject中的特定机制感兴趣]你可能会发疯,不为
List
执行grep/FIF/Shift-Ctrl-Q来找出真实的情况-代码干净整洁,测试提供了示例

例如,您可以将多个项绑定到一个接口,然后自动将它们添加到集合中:-

namespace Ninject.Tests.Integration.EnumerableDependenciesTests {
public class WhenServiceRequestsUnconstrainedListOfDependencies 
{
    [Fact]
    public void ServiceIsInjectedWithListOfAllAvailableDependencies()
    {
        kernel.Bind<IParent>().To<RequestsList>();
        kernel.Bind<IChild>().To<ChildA>();
        kernel.Bind<IChild>().To<ChildB>();

        var parent = kernel.Get<IParent>();

        VerifyInjection( parent );
    }

    protected override void VerifyInjection( IParent parent )
    {
        parent.ShouldNotBeNull();
        parent.Children.ShouldNotBeNull();
        parent.Children.Count.ShouldBe( 2 );
        parent.Children[0].ShouldBeInstanceOf<ChildA>();
        parent.Children[1].ShouldBeInstanceOf<ChildB>();
    }
}

public class RequestsList : IParent
{
    public IList<IChild> Children { get; private set; }

    public RequestsList( List<IChild> children )
    {
        Children = children;
    }
}

public interface IChild { }

public class ChildA : IChild { }
public class ChildB : IChild { }

public interface IParent
{
    IList<IChild> Children { get; }
}
namespace Ninject.Tests.Integration.Enumerabledependenciests{
当ServiceRequestsUnConstrainedListofDependencies时的公共类
{
[事实]
public void serviceinjectedwithlistofallavailabledependencies()
{
kernel.Bind().To();
kernel.Bind().To();
kernel.Bind().To();
var parent=kernel.Get();
验证注射(母体);
}
受保护的覆盖无效验证注入(IParent父级)
{
parent.shouldbenull();
parent.Children.shouldbenull();
父.子.数.应为(2);
parent.Children[0]。应安装();
parent.Children[1]。应安装();
}
}
公共类请求列表:IParent
{
公共IList子项{get;private set;}
公共请求列表(列出子项)
{
儿童=儿童;
}
}
公共接口IChild{}
公共类ChildA:IChild{}
公共类ChildB:IChild{}
公共接口IParent
{
IList子项{get;}
}

}

+1你给了我一个很好的起点。真正的问题比我在问题中遇到的问题要复杂一些,我没能想出更好的例子。如果我能想出一个,我会更新这个问题:)