2009-11-06 5 views
9

を満たすのはどのこれは私がDIコンテナから何をしたいです:関心のDIコンテナはこの

public class Class 
{ 
    public Class(IDependency dependency, string data) { } 
} 

var obj = di.Resolve<Class>(() => new Class(null, "test")); 

ポイント:

  1. は、コンストラクタで依存関係とデータの両方を解決することができます。
  2. タイプセーフな構文を使用してコンストラクタパラメータを渡すことができます(正確な構文は異なる場合があります)。はい(Expression.Body as NewExpression)からコンストラクタ引数を取得することで、自分でそれを行うことができますが、コンテナにどのような引数が登録されているかを検出する方法が必要になります。私はそれがIDependencyを解決する方法を知っているので、IoCのは、それを拾うしたい -

もう一つの主要な要件は、私は私のコンポーネントが自動的つまり私は、クラスを登録したくない、ピックアップすることがしたいということです。

また、プロパティーインジェクションは時には便利ですが、これはオプションです。

実際には、タイプセーフ、パラメータ、自動ピックアップのすべての機能を組み合わせることに問題があります... 1つの機能を確認するのは簡単ですが、それらの組み合わせは検証が容易ではありません特定の容器に精通しておらず、その特徴を知っていなければ。したがって、質問。

+0

この種の構文をサポートするコンテナはありません。しかし、多くの(ほぼすべての)コンテナは明示的なコンテナパラメータをサポートしています。 –

+0

"おそらく"は答えではありません...私が知っている限り、私はオブジェクトの[配列の配列を渡すことができますが、明らかに型セーフではありません...私はパラメータの順序を変更することができ、 。 – queen3

+0

クリーナーでは、上記のようにコード内でctorを明示的に使用する必要はありません。あなたが書いたものの代わりに、なぜそうではないのですか? 'var obj = new Class(di.Resolve ()、" test ");'? –

答えて

27

クラスを作成できる抽象ファクトリを定義する方がよいと思います。

public interface IFactory 
{ 
    MyClass Create(string data); 
} 

あなたは、このようなIFactoryですの実装を作成することができます。あなたのコンテナで

public class MyFactory : IFactory 
{ 
    private IDependency dependency; 

    public MyFactory(IDependency dependency) 
    { 
     if (dependency == null) 
     { 
      throw new ArgumentNullException("dependency"); 
     } 

     this.dependency = dependency; 
    } 

    #region IFactory Members 

    public MyClass Create(string data) 
    { 
     return new MyClass(this.dependency, data); 
    } 

    #endregion 
} 

は、あなたがMyFactoryとIDependencyの実装の両方を登録します。

あなたは今、クラスを取得するために工場、および工場を解決するための容器を使用することができます。

var mc = container.Resolve<IFactory>().Create(data); 

このアプローチは、完全に安全型とうまくランタイムアプリケーションデータからの依存関係を切り離しています。

+0

まさに!...................... –

+7

Abstract Factoryという名前で呼び出すためのボーナスポイントですが、インターフェイスを使用しています。私は彼らが聞いたときに多くの人々を見たことがある*抽象的な*工場は抽象基本クラスにまっすぐ行く。 –

+2

はい私はこれを知っていますが、単純なケースでは、インターフェイス、ファクトリ、ファクトリのコンストラクタ、Createメソッドなどでコンストラクタを複製するのは大変です。複雑なケースには適していますが、思う。そして、自動登録DIコンテナについての質問が残っています。 – queen3

関連する問題