5

コンパイル時にどのクラスをインスタンス化する必要があるかわからないプロジェクトに取り組んでいます。Activator.CreateInstance() を使用して、ユーザー入力に基づいて新しいクラスを生成しようとしています。以下のコードはうまく機能しますが、INECCQuery クラスのコンストラクターを変更して、デフォルトのコンストラクターのみを持ち、依存性注入を一切使用しないようにする必要がありました。インジェクション バインディングと Activator.CreatInstance() を引き続き使用する方法はありますか? 注射にはNinjectを使用しています。

    [HttpGet]
    public ActionResult Index(string item) {
      Type t = Type.GetType(string.Format("Info.Audit.Query.{0}Query, Info.Audit", item.ToUpper()));
      if (t != null) {
        INECCQuery query = (INECCQuery)Activator.CreateInstance(t);
        var results = query.Check();
        return View("Index", results);
      }
      return View("Notfound");
    }
4

3 に答える 3

3

可能な場合はコンストラクターインジェクションが常に推奨されますが、適切なバックアップはプロパティインジェクションを活用することです。

http://ninject.codeplex.com/wikipage?title=Injection%20Patterns

class SomeController {

  [Inject]
  public Object InjectedProperty { get; set; }

}

交換しようとしているという仮定に基づいて、使用したいファクトリまたは任意Activator.CreateInstanceのファクトリを注入できます。Func<T, INECCQuery>

于 2012-06-20T00:34:33.080 に答える
3

Ninject を取得して、実行時に t 型のオブジェクトを提供し、コンストラクターを介して依存性注入を取得することができます.. アプリケーション内の 1 つのケースで同様のことを行います。

Global.asax.cs ファイルには、次のメソッドがあります。

    /// <summary>
    /// Gets the instance of Type T from the Ninject Kernel
    /// </summary>
    /// <typeparam name="T">The Type which is requested</typeparam>
    /// <returns>An instance of Type T from the Kernel</returns>
    public static T GetInstance<T>()
    {
        return (T)Kernel.Get(typeof(T));
    }

これは、静的カーネル参照に依存します。

次に、コードで、私は

var myInfrastructureObject = <YourAppNameHere>.GetInstance<MyInfrastructureType>();

したがって、私はコンパイル時にタイプを知っていますが、あなたは知りませんが、それを変更することはそれほど難しくありません。

また、ServiceLocator パターンを調べることもできます。

于 2012-06-20T10:12:10.203 に答える
0

私は実際に、Activator.CreateInstanceメソッドに2番目のオプションを渡すだけで、コンストラクターのシグネチャと一致する限り機能することを発見しました。唯一の問題は、パラメータが一致しない場合、ランタイムエラーが発生することです。

Type t = Type.GetType(string.Format("Info.Audit.Query.{0}Query, Info.Audit", item.ToUpper()));
INECCQuery query = (INECCQuery)Activator.CreateInstance(t, repository);

すべての助けをありがとう。

于 2012-12-13T22:40:43.567 に答える