我正在转换一个动态实例化通用控制器的现有WebApi项目。基本上,如果有人GET / Students,我不创建Student控制器,而是使用DefaultHttpControllerSelector创建Student和runtime类型的Generic控制器:
public override HttpControllerDescriptor SelectController(HttpRequestMessage request)
{
Type genericControllerType = GetControllerType(domainType);
return new HttpControllerDescriptor(configuration, controllerName, genericControllerType);
}
else
{
throw new Exception("Uri is incorrect");
}
}
我可以在MVC Core中实现以下功能,但是因为我使用的是EntityFramework 6,所以这不会起作用,因为MVC Core必须使用依赖注入来实例化DBContext(DbContext不断抛出配置错误,因为我假设它需要成为范围,这很糟糕。)
例如:
routeBuilder.MapRoute("{controller}", context =>
{
string controllerType = (string)context.GetRouteValue("controller");
string method = context.Request.Method;
ControllerSelector selector = new ControllerSelector();
Controller controller = selector.SelectController(controllerType);
MethodInfo info = controller.GetType().GetMethod(method);
return context.Response.WriteAsync($"Controller {controllerType} was called with method {method}");
});
就像我说的,看起来我需要动态创建我的类型的每个通用范围,如下例所示:
//Need to loop through all my types that are tied to the generic controller and create these scopes manually I assume
services.AddScoped<SchoolContext>(_ => new SchoolContext(Configuration.GetConnectionString("DefaultConnection")));
然后让MVC接管控制器创建,以便依赖注入适用于此DbContext。
有没有人有任何想法?也许我不需要这样做,如果我可以让EF6的DbContext工作,但每次我传入ConnectionString名称,它会抛出某种DLL的错误(无法找到System.Data / ConfigurationManager不能找到)。我甚至尝试将已建立的连接传递给DbContext。从在线阅读和查看样本,必须在上面的范围内传递。
当我尝试使用连接字符串名称执行正常的DbContext初始化时会发生什么:
添加该引用后,我收到以下错误:
无法从程序集'System.Data,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'加载类型'System.Data.Common.DbProviderFactories'。“