2017-02-04 6 views
0

オープンジェネリックのタイプを、別のオープンジェネリックとプリミティブをコンストラクタに注入して登録するにはどうしたらいいですか?
以下の例を参照してください。
この例では、Resolveが "Stringをパラメータとして解決できません"というconnectionString "例外をスローしています。 (あなたはライブコードhereを確認することができます)注入されたプリミティブでジェネリックを開く

using System; 
using DryIoc; 

public class Program 
{ 
    public static void Main() 
    { 
     var container = new Container(); 

     container.RegisterInstance("some_connection_string", serviceKey: "connectionString"); 
     container.Register(typeof(Configuration<>), Reuse.Singleton); 
     container.Register(typeof (IEntityUpdater<>), typeof (SqlEntityUpdater<>), Reuse.Singleton); 

     var p = container.Resolve<IEntityUpdater<EventArgs>>(); 

     Console.WriteLine(p); 
    } 
} 

public class Configuration<T> where T : class { } 


internal interface IEntityUpdater<in T> where T : class 
{ 
    void Update(T entity); 
} 

internal class SqlEntityUpdater<T> : IEntityUpdater<T> where T : class 
{ 
    public SqlEntityUpdater(Configuration<T> configuration, string connectionString) 
    { 
    } 

    public void Update(T entity) { } 
} 

答えて

1

まず、RegisterInstanceが廃止予定され、UseInstanceを使用しています。

第2に、実際の問題は、serviceKeyというインスタンスを登録し、このキーを注射に使用していないということです。

したがって、serviceKeyパラメータを削除してください。

あるいは、射出側のキーを指定します、dadhiを返信用

container.Register(typeof(IEntityUpdater<>), typeof(SqlEntityUpdater<>), Reuse.Singleton, 
    made: Parameters.Of.Type<string>(serviceKey: "connectionString")); 
+0

感謝。申し訳ありませんが、あなたの答えが問題の解決にどのように役立つのか分かりません。私の例で分かるように、 'SqlEntityUpdater'はコンストラクタで2つのサービスを必要とします。私は 'serviceKey'の問題を認識していますが、' made: '引数に複数の' Parameters.Of.Type <> 'をどのように使用できますか? – DMVC

+0

私は悪いことはしません。私はすべての引数を指定する必要があると仮定していました。しかし、DryIocはそれらのいくつかを理解するのにちょっとした助けが必要なようです。もう一度ありがとう。 – DMVC

関連する問題