使用DependencyResolver的MVC 3应用程序中的Ninject通过字符串解析服务

本文关键字:字符串 服务 MVC DependencyResolver 应用程序 使用 Ninject | 更新日期: 2023-09-27 18:00:05

我想使用Ninject功能与DependencyResolver一起工作,这样我就可以做这样的事情:

string contentType = "Page";
IContentRepository<contentType> repository = System.Web.Mvc.DependencyResolver.Current.GetService<IContentRepository<contentType>>();

contentType是动态的,所以它可以是(几个选项中的)任何东西,我不想写if..else..显然,上述方法不起作用。我必须以某种方式从字符串中获取Type。IContentRepository是泛型的,接受从ContentBase类派生的类型,Page(在上面的示例中)就是这样做的。

在使用旧Ninject的MVC 2中,我通过一个自定义存储库工厂(IRepositoryFactory)来完成这项工作,该工厂将接收字符串,然后将其传递给存储库的构造函数。但这种方法适用于非通用存储库,并且还需要存储库中的特殊构造函数,如果可能的话,我希望避免这种情况。

这是在控制器之外,所以我不能使用控制器构造函数注入(实际上我已经开始工作了)。我真的很纠结。

使用DependencyResolver的MVC 3应用程序中的Ninject通过字符串解析服务

您必须使用反射来动态调用泛型。

这应该有效:

var targetType = typeof(IContentRepository<>).MakeGenericType(Type.GetType(contentType));
object repository = System.Web.Mvc.DependencyResolver.Current.GetType().GetMethod("GetService").MakeGenericMethod(targetType).Invoke(System.Web.Mvc.DependencyResolver.Current, null);