cdi*_*die 9 c# asp.net-core-mvc asp.net-core
我们目前正在开发一个动态系统,需要在运行时加载一些扩展.
扩展构建在与MVC app相同的体系结构上,MVC app表示控制器文件夹,其中的类以Controller结尾,相关的View和ViewComponents位于/ View/ControllerName中,以及相关的模型.
无法将此项目添加为项目的引用,因此我创建了一个在运行时加载它们的中间件:
foreach (var item in extensions)
{
Assembly.LoadFrom($@"extensions\{item.Name}.dll");
}
Run Code Online (Sandbox Code Playgroud)
到目前为止很好,它们在运行时加载.但是,当我尝试访问在扩展程序控制器之一中创建的路由时,WebSite会给出404响应.
我尝试添加扩展作为参考,它运行良好,所以这不是我的扩展中的问题.
如何设置将我的dll控制器注册到MVC主站点?
这不是ASP MVC 4,这是ASP Core,因此看来这个答案无效:asp.net mvc把控制器放到一个单独的项目中
虽然依赖注入可能是一个解决方案,但我没有找到任何解决方案来为自己制作我的扩展注册服务(并且它对于扩展创建者来说很复杂).
我的扩展路由定义为Controller端:
[Route("[controller]/[action]")]
public class LotteryController : Controller { ... }
Run Code Online (Sandbox Code Playgroud)
在我的Startup.cs上,我实际上保留了默认路由:
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
Run Code Online (Sandbox Code Playgroud)
事实是,我希望我的扩展程序启用路由:http:// localhost/Lottery/Index
它给了我一个空白页面.出于测试目的,我当前的Index操作是
// GET Index
public IActionResult Index()
{
return Content("From extension");
//return View();
}
Run Code Online (Sandbox Code Playgroud)
这是我的扩展项目层次结构
MVC将自动查找Controller在启动时继承并包含它们的控制器.这将适用于外部程序集,但很可能只适用于静态链接的程序集.
如果您正在动态加载它们,您可能想要尝试延迟MVC的启动或单独注册程序集.
此代码段显示如何搜索其他程序集以获取控制器.可在此处找到解释此内容的完整文章.加载程序集后,您可以使用此命令强制MVC搜索控制器.
services.AddMvc().AddControllersAsServices(new[]
{
typeof(MyController).Assembly,
typeof(ExternalPocoController).Assembly
});
Run Code Online (Sandbox Code Playgroud)
这将搜索那些程序集的控制器.唯一需要注意的是,它可能无法找到相关的视图.我真的不确定这一点,因为我只使用过WebAPI控制器.编辑: 这看起来可能是让视图正常工作的一种方式
作为旁注,我可能建议使用路径装饰器或通过旧方式映射路线.使用两者似乎是一个麻烦的方法.
| 归档时间: |
|
| 查看次数: |
1304 次 |
| 最近记录: |