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

本文关键字:代码 共享 方式吗 之间 应用程序 开始 mvc | 更新日期: 2023-09-27 18:21:42

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

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

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

  • 为共享的东西创建一个DB,为特定于应用程序的东西创建另一个(每个应用程序)

  • 每个应用程序在web配置中将有2个连接

  • 从共享模型和控制器创建DLL。将其放在/bin目录中,并在项目中引用它。我希望这能近似于nuget包的工作方式,并参考

  • 为每个应用程序创建一个SharedApplicationDBContext和一个LocalApplicationDBContext,每个都访问各自的数据库。


问题

  • 以上步骤正确吗?

  • 有没有办法在DLL中包含cshtml视图?

  • 在DLL中包含用户控制器/模型可以吗?

  • 当我在多个应用程序上共享这样的代码时,有什么问题需要注意吗?

我知道SO喜欢具体的问题,这有点模糊,但我在这里有点力不从心,正在寻找一些关于正确方法的一般指导。

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

您已经有了大致的想法,但它需要一些调整:

  1. 不要摆弄DLL。如果项目存在于同一个解决方案中,那么您也可以将类库保留在那里。在这种情况下,您可以直接进行项目引用。如果您正在处理多个解决方案,那么您可以将类库打包为nuget包,并将其实际安装在每个项目中。创建nuget包很容易,您可以从本地/网络路径安装,也可以设置自己的私人nuget repo。这使得共享资源变得非常容易,并且您可以发布更新,并一目了然地看到哪些项目正在运行类库的哪些版本。

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

  3. 您可以将视图包含在类库中,但不能作为cshtml包含。它们必须被编译到类库中。您需要RazorGenerator来完成这一任务。

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

关于视图的问题,您可以将它们包含在DLL中,请阅读此处

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

对于控制器,你可以这样做,但你必须让MVC知道控制器的位置,你可以通过编写自定义ControllerFactory来做到这一点,请在这里阅读更多。