MVC核心创建控制器的通用实例

时间:2017-08-29 12:40:01

标签: asp.net-core asp.net-core-mvc

我正在转换一个动态实例化通用控制器的现有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初始化时会发生什么:

Can't find ConfigurationManager

添加该引用后,我收到以下错误:

  

无法从程序集'System.Data,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'加载类型'System.Data.Common.DbProviderFactories'。“

0 个答案:

没有答案