这是开始跨多个 mvc 应用程序共享代码的合适方式吗?

Is this an appropriate way to start sharing code across mutliple mvc apps?

我们正在为同一家公司开发多个应用程序。

应用程序是不同的(因此不适合多租户应用程序)但会有很多共享模型、几个共享控制器和理想情况下一些共享视图。

这是我第一次不得不这样做,想知道我是否正确地处理了它。这是我的计划:


问题

我知道 SO 喜欢具体的问题,这有点含糊,但我在这里有点超出我的理解范围,正在寻找一些关于正确方法的一般指导。

关于视图的内容,你可以将它们包含在一个DLL中,请阅读here

对于模型,可以将它们放在不同的项目中。

对于控制器,你可以这样做,但你必须让 MVC 知道控制器的位置,你可以通过编写自定义 ControllerFactory 来完成,请阅读更多内容 here

您已经了解了总体思路,但还需要一些调整:

  1. 不要乱用 DLL。如果项目存在于同一个解决方案中,那么您也可以将 class 库也保留在那里。在这种情况下,您可以直接进行项目参考。如果您正在处理多个解决方案,那么您将 class 库打包为 nuget 包,并将其实际安装在每个项目中。创建 nuget 包是 easy enough, and you can either install from a local/network path or you can set up your own private nuget repo。这使得共享资源变得非常容易,并且您可以发布更新并一目了然地查看哪些项目是 运行 您的 class 库的哪些版本。

  2. 每个应用程序都应该只具有与其单独数据库相关的上下文。共享数据库还可以使用共享上下文,它包含在您的 class 库中。您还应该将与此共享上下文相关的所有迁移存放在同一个 class 库中。

  3. 您可以在 class 库中包含视图,但不能作为 cshtml。它们必须被编译到 class 库中。您需要 RazorGenerator 才能完成此操作。

  4. 将与用户相关的模型包含在您的共享库中是 100% 可以的。但是,控制器比较棘手。除非您设置一个单独负责处理所有身份验证的 SSO 服务器(至少可以说这是一项非常重要的任务),否则每个应用程序都需要它自己的控制器来执行身份验证任务。如果所有站点都驻留在同一个域或其子域中,您可以轻松地在它们之间共享 auth cookie。但是,如果它们驻留在完全不同的域中,您仍然可以共享相同的 "users",因为每个站点都使用相同的数据库,但是每个站点都需要一个单独的登录过程(登录一个不会登录你在另一个,即使相同的凭据对两者都有效)。唯一的解决办法还是 SSO。