我应该在一个解决方案中有多个项目,还是应该为一个控制台和 Web 应用程序共享同一个数据库的多个解决方案?

Should I have multiple projects in a Solution or multiple Solutions for a console and web application that share same database?

我目前有一个 asp.net 控制台应用程序,它只是通过 API 从远程服务器检索大量数据,然后使用 Entity Framework,将其保存到 [=29] =] 数据库。该应用程序需要 3-4 天才能完成 运行,我 运行 每个月左右手动完成一次。

该项目分为模型 class 和存储库 class 以及应用程序本身。

我现在需要构建一个 ASP.NET MVC 网络应用程序,它允许用户查看已检索的数据,并且正在寻找有关如何最好地构建它的建议。

我是否在我的解决方案中创建一个新的 ASP.NET MVC 项目并将其设置为启动应用程序,引用相同的模型和存储库 classes?如果是这样,我该如何 运行 我的控制台应用程序?还是最好将它们作为单独的解决方案,只引用同一个数据库?

还有更好的方法吗? (即,是否可以通过某种方式将控制台应用程序重建为前端的一部分,并使用队列或工作程序定期获取数据?)

感谢您的帮助, 罗比.

就我个人而言,我会将它们作为单独的项目和单独的解决方案保留,它们只引用同一个数据库,但是将两个解决方案可以共享的代码移到单独的 class 库中。

您的 Web 应用程序呈现建模数据的方式很可能与您的控制台应用程序使用它的方式大不相同;所以使用相同的模型和存储库很可能会将您的 Web 应用程序进一步耦合到您的控制台应用程序。

这与微服务的工作方式非常相似,微服务的行为和发展独立于其消费者(在本例中为您的 Web 应用程序),并且仅通过明确定义的 API.

相同的解决方案。不同的项目。通过在同一个解决方案中,您可以轻松地引用共享组件。我实际上建议将您的实体、存储库等分解为第三个项目,一个 class 库,然后您的控制台应用程序和 MVC 应用程序都将引用它。

如果你不把所有东西都放在同一个解决方案中,那么你要么陷入 DLL 地狱,你必须在其中构建你的项目并手动将 DLL 复制到另一个项目中,添加引用,然后当您对该 DLL 进行更改时,使所有内容保持最新。涉及的项目越多,熵就越大,您的项目全部以 运行 不同版本的 DLL 结束的可能性就越大。

另一种选择是创建一个包含共享组件的 Nuget 包,将其托管在您自己的私有存储库中,然后将其添加到需要它的每个项目中。然而,虽然设置所有这些非常容易,但并非 100% 顺畅,您必须记住在进行更改时重新打包和重新发布 Nuget,然后在每个引用项目中单独更新包。

总而言之,相同的解决方案始终是最好的方法,除非有充分的理由不这样做。这是唯一的 "it just works" 方法。