代码之家  ›  专栏  ›  技术社区  ›  Perpetualcoder

如何在集合窗体中插入依赖项?

  •  2
  • Perpetualcoder  · 技术社区  · 16 年前

    如何将依赖项连接到依赖项以集合形式存在的位置??

    例如:

    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
    }
    }
    

    在这种情况下,如何使用ninject这样的容器??

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

    3 回复  |  直到 16 年前
        1
  •  1
  •   Ruben Bartelink    16 年前

    你可以 Bind 封闭式 List<X> ToConstant() , ToMethod() 等。

    但你必须提供更多的细节,你想在名单上什么,否则我只是在做一些无聊的猜测,你到底想要什么。

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

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

    [如果你对niject的特定机制感兴趣]如果你不 download the source 并对执行grep/fif/shift-ctrl-q List 为了找出真实的故事-代码是干净整洁的,测试提供了示例。

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

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

    }

        2
  •  1
  •   Nicholas Blumhardt    16 年前

    在autofac中,您将使用一个IEnumerable构造函数依赖项:

    public class Ninja {
    
      public Ninja(IEnumerable<IShuriken> shurikens, IKatana katana)
      {
        // ...
      }
    

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

        3
  •  0
  •   Krzysztof Kozmic    16 年前

    我不知道Ninject的事。在里面 Castle Windsor 你会用 ListResolver 这将提供 IShuriken .