asp.net核心mvc:将托管和业务逻辑/ ui拆分为单独的项目

时间:2019-04-30 12:11:30

标签: c# asp.net-core .net-standard

我想将解决方案至少分为两部分:

  • 托管技术(初始化Kestrel并设置所有中间件,例如swashbuckle,身份验证)
  • 业务逻辑和用户界面

因为我希望在开发过程的后期阶段可以替换托管配置。

我尝试将所有包含控制器,模型和视图的文件夹简单地移动到一个单独的项目中,如下图所示:

两个具有托管配置和业务逻辑分离的项目:

enter image description here

所以我

  • 将这些文件夹移至*。实施项目
  • 在程序包“ Microsoft.AspNetCore.Mvc”中添加了nuget引用
  • 从* .Host项目引用了* .Implementation项目
  • 将此类添加到* .Implementation项目中的“ Controllers”文件夹中:
using Microsoft.AspNetCore.Mvc;

namespace MyApp.Implementation.Controllers
{
    public class ExampleController : Controller
    {
        public ActionResult<int> Index()
        {
            return 5;
        }
    }
}

如果启动应用程序并在浏览器中打开http://localhost:5000/example,则在浏览器中得到结果“ 5”。这向我表明,托管技术可以在单独的项目中找到我的控制器。

但是,当我在浏览器中打开http://localhost:5000时,出现一个异常页面,告诉我找不到Home-Controller的视图。控制台还显示异常:

fail: Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware[1]
      An unhandled exception has occurred while executing the request.
System.InvalidOperationException: The view 'Index' was not found. The following locations were searched:
/Views/Home/Index.cshtml
/Views/Shared/Index.cshtml
/Pages/Shared/Index.cshtml

由于Web主机找到了我的控制器,所以我希望它也能找到视图。似乎并非如此。

如何告诉虚拟主机在哪里寻找视图呢?还是我需要对他们做任何事情?

2 个答案:

答案 0 :(得分:6)

除了柯克·拉金(Kirk Larkin)评论Application Parts in ASP.NET Core的评论外,您可能还想看看Razor Class Libraries

我还没有尝试过,但是看起来它可以为您的问题提供解决方案。

答案 1 :(得分:2)

移动控制器文件夹时出现的问题,它无法在Startup.cs中检测到控制器。

其中应该有一行:

     app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });

根据this链接,您应该做的是为其添加一个名称空间,如下所示:

   app.UseMvc(routes =>
      routes.MapRoute(  
         name: "Default",
         url: "{controller}/{action}/{id}",
         defaults: new { controller = "Foo", action = "Index", id =      UrlParameter.Optional },
         // This will prioritize routes within your main application
         namespaces: new[] { "ProjectA.Controllers"}
      );
    });

希望这对您有用。