在 C# 中创建两个非常相似的软件包有哪些不同的方法
What are the different ways to create two very similar software packages in C#
我正在编写一个软件套件,它主要由使用 WPF 的 C# .Net 中的两个独立应用程序组成。尽管它们看起来可能有点不同,但它们本质上就像是同一软件包的精简版和完整版。完整版包含精简版的所有功能。
我之前通过创建两个单独的应用程序来完成此操作,这两个应用程序共享一个 class 库,其中包含所有常见的用户控件。但是我现在想知道这种架构有没有更好的设计。
我什至想创建一个应用程序,并在运行时让它决定它将作为哪个版本运行。
任何对此类问题有任何经验的人都可以为我指明正确的方向。
保持简单
我的经验法则是尽可能使解决方案尽可能简单。话虽这么说,我会使用您正在使用的相同组合。
通常这样分解项目:
应用程序逻辑: CompanyPrefix.ProjectPrefix.Core
、CompanyPrefix.ProjectPrefix.Data
...等等
应用程序:CompanyPrefix.ProjectPrefix.ApplicationType.App
,所以一些例子:
CompanyPrefix.ProjectPrefix.Web.App
CompanyPrefix.ProjectPrefix.Console.App
CompanyPrefix.ProjectPrefix.Wcf.App
因为你有两个 Wcf 应用程序可能想要做一些像
CompanyPrefix.ProjectPrefix.Wcf.Lite.App
CompanyPrefix.ProjectPrefix.Wcf.App
所以在此示例中,CompanyPrefix.ProjectPrefix.Wcf.App
和 CompanyPrefix.ProjectPrefix.Wcf.Lite.App
都指向 CompanyPrefix.ProjectPrefix.Core
或您的业务逻辑所在的任何位置。
关于动态加载程序集
有一种方法可以在运行时动态加载您的库,但除非您处理的是独立组件的模块化系统,否则建议不要使用它。
如果您愿意的话,MSDN 上有很多资源,可能会开始 here。关于将程序集加载到当前应用程序域的文章。
想出一个清单
我觉得有帮助的一件事是提出一个清单来帮助我做出决定,以防我遇到困难。通常最终会变成这样:
- 这有商业价值吗?
- 这是否会使调试更难?
- 与我过去采用的方法相比,采用新方法的优缺点是什么?
这不是我的详尽清单,但解释了这一点。当你有一群人出于个人原因主要坚持 没有任何基础的选择 以及使用工具时,这也很有帮助 当你无法做出决定并坚持下去时
处理应用程序逻辑更改(编写干净的代码)
想出一个过于复杂的 "never need to recompile entire application again" 是我过去犯过的错误。您仍然需要部署和编译一些东西。
处理应用程序变更最重要的是
- 在源代码管理上有代码(最重要)
- 编写干净的代码
- 编写测试
- 写文档(我知道没有人喜欢这样做)
- 再写一些测试
在处理应用程序更改时,消耗你大部分时间的是调试,所以专注于减少花在调试上的时间,而不是花在编译和部署上的时间
对于部署设置持续集成
如果您有能力设置CI,将消除 99% 的麻烦 ]更改应用程序。第一次设置可能会浪费一两天时间,但这是非常值得的。
我正在编写一个软件套件,它主要由使用 WPF 的 C# .Net 中的两个独立应用程序组成。尽管它们看起来可能有点不同,但它们本质上就像是同一软件包的精简版和完整版。完整版包含精简版的所有功能。
我之前通过创建两个单独的应用程序来完成此操作,这两个应用程序共享一个 class 库,其中包含所有常见的用户控件。但是我现在想知道这种架构有没有更好的设计。
我什至想创建一个应用程序,并在运行时让它决定它将作为哪个版本运行。
任何对此类问题有任何经验的人都可以为我指明正确的方向。
保持简单
我的经验法则是尽可能使解决方案尽可能简单。话虽这么说,我会使用您正在使用的相同组合。
通常这样分解项目:
应用程序逻辑: CompanyPrefix.ProjectPrefix.Core
、CompanyPrefix.ProjectPrefix.Data
...等等
应用程序:CompanyPrefix.ProjectPrefix.ApplicationType.App
,所以一些例子:
CompanyPrefix.ProjectPrefix.Web.App
CompanyPrefix.ProjectPrefix.Console.App
CompanyPrefix.ProjectPrefix.Wcf.App
因为你有两个 Wcf 应用程序可能想要做一些像
CompanyPrefix.ProjectPrefix.Wcf.Lite.App
CompanyPrefix.ProjectPrefix.Wcf.App
所以在此示例中,CompanyPrefix.ProjectPrefix.Wcf.App
和 CompanyPrefix.ProjectPrefix.Wcf.Lite.App
都指向 CompanyPrefix.ProjectPrefix.Core
或您的业务逻辑所在的任何位置。
关于动态加载程序集
有一种方法可以在运行时动态加载您的库,但除非您处理的是独立组件的模块化系统,否则建议不要使用它。
如果您愿意的话,MSDN 上有很多资源,可能会开始 here。关于将程序集加载到当前应用程序域的文章。
想出一个清单
我觉得有帮助的一件事是提出一个清单来帮助我做出决定,以防我遇到困难。通常最终会变成这样:
- 这有商业价值吗?
- 这是否会使调试更难?
- 与我过去采用的方法相比,采用新方法的优缺点是什么?
这不是我的详尽清单,但解释了这一点。当你有一群人出于个人原因主要坚持 没有任何基础的选择 以及使用工具时,这也很有帮助 当你无法做出决定并坚持下去时
处理应用程序逻辑更改(编写干净的代码)
想出一个过于复杂的 "never need to recompile entire application again" 是我过去犯过的错误。您仍然需要部署和编译一些东西。
处理应用程序变更最重要的是
- 在源代码管理上有代码(最重要)
- 编写干净的代码
- 编写测试
- 写文档(我知道没有人喜欢这样做)
- 再写一些测试
在处理应用程序更改时,消耗你大部分时间的是调试,所以专注于减少花在调试上的时间,而不是花在编译和部署上的时间
对于部署设置持续集成
如果您有能力设置CI,将消除 99% 的麻烦 ]更改应用程序。第一次设置可能会浪费一两天时间,但这是非常值得的。