2010-04-22 69 views
2

如何連接依賴項以集合的形式存在的依賴關係?如何在集合表單中注入依賴關係?

例如:

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。 :)

回答

1

您可以Bind封閉式List<X>ToConstant()ToMethod()

但你必須以提供更多的細節,你在列表中想要什麼,或者我只是在遊資炒作是被確切地搞你想要什麼。

編輯迴應你和你的評論:如果你正在處理「未知」或鬆散的依賴關係,那麼MEF在這方面做了很多東西。

[通常與DI]如果你在內部做某事,它是一個更「已知」/固定/複雜的解決機制,你最好通過建立一個Repository或其他協調對象管理您可以根據需要請求子集和/或其他預測的列表。

[如果你有興趣在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; } 
} 

}

+0

+1你給了我一個很好的起點。真正的問題比我在問題中有些複雜,我無法提出更好的樣本..我會更新問題,如果我能想到一個:) – Perpetualcoder 2010-04-22 17:08:08

0

我不知道Ninject。在Castle Windsor中,您將使用ListResolver,這將提供IShuriken的所有實現。

1

在Autofac你使用一個IEnumerable構造函數依賴:

public class Ninja { 

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

Autofac會發現任何可用的shurikens並自動提供給構造函數。