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

时间:2011-06-22 11:18:21

标签: c# asp.net-mvc-3 dependency-injection ninject

我想使用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)完成了它,它将获取字符串,然后将其传递给存储库的构造函数。但是这种方法适用于非通用存储库,它还需要存储库中的特殊构造函数,如果可能的话,我希望避免使用它。

这是在控制器之外,所以我不能使用控制器构造函数注入(我实际上工作)。我真的很困惑。

1 个答案:

答案 0 :(得分:0)

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

这应该有效:

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);