【问题标题】:asp.net core mvc: split hosting and business-logic/ui into separate projectsasp.net core mvc:将托管和业务逻辑/用户界面拆分为单独的项目
【发布时间】:2019-05-25 18:25:10
【问题描述】:

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

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

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

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

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

所以我

  • 将这些文件夹移至 *.Implementation 项目
  • 添加了对“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

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

我怎样才能告诉网络主机在哪里寻找视图呢?还是我需要对他们做些什么?

【问题讨论】:

  • 我认为 UI 与托管技术的耦合非常紧密,强制分离可能需要一个 hacky 解决方案。我理解分离业务逻辑的必要性,但你真的应该分离 UI 引擎吗?

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


【解决方案1】:

除了 Kirk Larkin 的评论查看Application Parts in ASP.NET Core,您可能还想查看Razor Class Libraries

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

【讨论】:

    【解决方案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"}
          );
        });
    

    希望这对你有用。

    【讨论】:

      猜你喜欢
      • 2021-02-24
      • 2011-09-03
      • 2015-06-25
      • 2022-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-24
      相关资源
      最近更新 更多