簡體   English   中英

Activator.CreateInstance和Ninject

[英]Activator.CreateInstance and Ninject

我有一個正在處理的項目,我不知道在編譯時需要實例化哪個類。 我正在嘗試使用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");
    }

在可能的情況下,始終首選構造函數注入,但是適當的備份將是利用屬性注入。

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

class SomeController {

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

}

基於您要替換Activator.CreateInstance的假設,您可以注入Func<T, INECCQuery>或希望使用的任何工廠。

您可以獲得Ninject在運行時為您提供類型為t的對象,並且仍然可以通過構造函數獲取依賴項注入。...在我的應用程序中,我針對一種情況做了類似的事情。

在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模式。

實際上,我發現您可以將第二個選項傳遞給Activator.CreateInstance方法,並且只要它與構造函數的簽名匹配即可。 唯一的問題是,如果您的參數不匹配,則會出現運行時錯誤。

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

感謝您的所有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM