繁体   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