2016-03-24 2 views
1

でリストを初期化します。がDryIoc

 var container = new Container(); 
     container.RegisterInstance("a", serviceKey: "a"); 
     container.RegisterInstance("b", serviceKey: "b"); 

をどのように私は「」と「B」が含まれる文字列のリストを登録できますか?

私もparamsに頼ってみましたが、成功しませんでした。

class T 
    { 
     public string[] x; 

     public T(string s, params string[] strs) 
     { 
      x = (new[] {s}).Union(strs).ToArray(); 
     } 
    } 

    static void Main(string[] args) 
    { 
     var container = new Container(); 
     container.RegisterInstance("a", serviceKey: "a"); 
     container.RegisterInstance("b", serviceKey: "b"); 
     container.Register<T>(made: Made.Of(() => new T(Arg.Of<string>("a")))); 
     container.Register<T>(made: Made.Of(() => new T(Arg.Of<string>("a"), Arg.Of<string>("b")))); 

EDIT:

私は、このランニングを持って管理し、それは、良いworkarroundではないかもしれません。

 container.RegisterInstance(typeof(IEntityManager), (IEntityManager)ctx.GetObject("entityManager_candidate"), serviceKey: "candidate"); 
     container.RegisterInstance("XYZ_CANDIDATE", serviceKey: "candidate"); 
     container.Register<IDalCandidate>(serviceKey: "candidate", 
      made: Made.Of(() => new DalCandidate(Arg.Of<IEntityManager>("candidate"), Arg.Of<string>("candidate")))); 
     container.RegisterInstance(typeof(IEntityManager), (IEntityManager)ctx.GetObject("entityManager_resource"), serviceKey: "resource"); 
     container.RegisterInstance("XYZ_RESOURCE", serviceKey: "resource"); 
     container.Register<IDalCandidate>(serviceKey: "resource", 
      made: Made.Of(() => new DalCandidate(Arg.Of<IEntityManager>("resource"), Arg.Of<string>("resource")))); 
     //container.RegisterMapping<IDalCandidate, DalCandidate>() 
     var lst = new List<IDalCandidate> 
     { 
      container.Resolve<IDalCandidate>("resource"), 
      container.Resolve<IDalCandidate>("candidate") 
     }; 
     container.RegisterInstance(typeof(IList<IDalCandidate>), lst); 
     container.Register<ISearchWeightedCandidateManager, SearchWeightedCandidateManager>(); 
+0

私はあなたが達成したいとは思っていません。あなたはKeyValuePair []のように文字列の値を文字列のキーで注入することができます。そして、通常のLinqを使うことができます。すべてのタイプのサービスキーが必要な場合は、KeyValuePair []を使用します。詳細はこちらhttps://bitbucket.org/dadhi/dryioc/wiki/RegisterResolve#markdown-header-resolving-as-keyvaluepair-wrapper – dadhi

+0

いくつかのコンストラクタに注入するにはのリストが必要です(SearchWeightedCandidateManagerにはIDalCandidateのIListが必要です) )。 –

+0

次に、リストを挿入します。何が問題なのですか? DryIocはIList ラッパーをサポートしています。 – dadhi

答えて

0

更新:あなたを見てみると良い答え

基本的には、ある種のマルチテナンシーを持っていて、すべてのテナントを一部の消費者に注入しています。

c.Register<Dal>(serviceKey: "x"); 
c.Register<Dal>(serviceKey: "y"); 

// using delegate for brevity, better convert to method 
Func<object, Func<RequestInfo, bool>> getCondition = 
    key => r => r.Parent.Enumerate().Any(p => p.ServiceKey == key); 
var inX = getCondition("x"); 
var inY = getCondition("y"); 

c.RegisterInstance("a", condition: inX); 
c.RegisterInstance("b", condition: inY); 

// register the rest of dependencies in X or in Y 

c.Register<Manager>(); // normally injects Dal[] 

これはそのアイデアです。私の最初の答えよりもあなたのケースに関連性があることを願っています。

+0

このコードが呼び出される前に、さまざまな文字列をさまざまな用途に使用するためにservicekeysで保存するとどうなりますか?私はリストがデザインの匂いであると感じる理由を理解していません。 –

+0

次に、Bに必要な文字列を取得するために、異なるアプローチを使用するかもしれません。また、異なるサービスに必要な文字列を区別するために、特定のサービスキー形式またはタイプを使用することもできます。私はリストでOKですが、あなたの設定は間違った設定がされているかもしれない慣習に依存しており、バグを見つけるのは難しいです。 – dadhi

関連する問題