[英]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.