什么是允许根据每个客户轻松定制产品的良好解决方案结构?

2024-01-04

我正在寻找一些关于如何在每个客户的基础上轻松定制和扩展核心产品的建议。我知道这可能是一个太大的问题。然而,我们确实需要一些想法,因为如果我们设置错误,它可能会给我们带来多年的问题。我在定制和扩展现有产品方面没有太多经验。

我们有一个核心产品,通常根据每个客户进行定制。我们最近使用 MVC3 前端用 C# 4 重写了该产品。我们进行了重构,现在有 3 个项目组成了解决方案:

  • 核心域项目(命名空间 - projectname.domain.*) - 由域模型(供 EF 使用)、域服务接口等(存储库接口)组成
  • 域基础设施项目(命名空间-projectname.infrastruct.*)-实现域服务-EF上下文、存储库实现、文件上传/下载接口实现等。
  • MVC3(命名空间-projectname.web.*)-由控制器、视图模型、CSS、内容、脚本等组成的项目。它还有 IOC (Ninject) 处理项目的 DI。

该解决方案作为独立产品运行良好。我们的问题是根据每个客户扩展和定制产品。我们的客户通常希望快速(通常在签订合同后几天内)获得带有品牌 CSS 和样式的核心产品版本。然而,70% 的客户希望通过定制来改变其运作方式。一些定制很小,例如域模型、视图模型和视图等上的附加属性。其他定制则更重要,需要全新的域模型和控制器等。

有些定制似乎对所有客户都有用,因此我们会定期更改它们的定制并将它们添加到核心中。

我们目前将源代码存储在 TFS 中。要启动项目,我们通常手动将源代码复制到新的团队项目中。更改命名空间以反映客户端名称并开始自定义基本部分,然后部署到 Azure。这显然会导致代码库完全重复,我确信这不是正确的方法。我认为我们可能应该拥有一些提供核心功能并在需要时扩展/覆盖的东西。但是我真的不知道该怎么做。

因此,我正在寻找有关最佳项目配置的任何建议,以允许:

  • 快速部署代码 – 轻松启动新客户端 允许品牌/微小的改变
  • 避免复制和粘贴代码的需要
  • 尽可能多地使用 DI 以保持松散耦合
  • 允许定制代码 每个客户基础
  • 单一扩展核心产品的能力 放置并让所有客户获得该功能(如果我们获得) 最新版本的核心并重新部署

非常感谢任何帮助/建议。很高兴添加更多任何人认为有帮助的信息。


我可能无法完全回答这个问题,但这里有一些建议:

  1. 无论出于何种原因,永远不要复制您的代码。
  2. 不要重命名命名空间来标识给定的客户端版本。为此使用分支和持续集成。
  3. 选择如下分支模型:一个名为“Main”的根分支,然后从产品的每个主要版本的 Main 中创建一个分支,然后为每个客户端创建一个分支。当您开发某些东西时,从一开始就根据您正在做的事情确定要在哪个分支中开发(客户端特定功能将在客户端分支中,全局版本将在版本分支或客户端分支中,如果您想要原型一开始就是这样)
  4. 尽量依靠工作项来跟踪您开发的功能,以了解它在哪个分支中实现,以简化跨分支的合并。

为你的开发者定位正确的分支是最关键的事情,你不必定义一些“在什么情况下做什么”的硬性规则,但要尽量保持一致。

我从事过一个大项目长达 10 年,有超过 75 个版本,我们通常做的是:

  • 下一个主要版本:从 Main、dev 里面创建一个新分支
  • 下一个小版本:当前主分支中的 dev,使用 Labels 标记分支内的每个小版本。
  • 一些复杂的功能特性是在客户要求的分支中开发的,当我们成功“去品牌”时,将其反向集成到版本分支中。
  • 客户端分支中的错误修复,然后在需要时在其他分支中报告。 (您必须为此使用工作项,否则您很容易迷失方向)。

这是我的看法,其他人可能有不同的观点,我非常依赖工作项来跟踪代码,这对代码的交付和报告有很大帮助。

EDIT

好的,我添加一些关于分支的想法/反馈:

在软件配置管理 (SCM) 中,有两个功能可以帮助您进行版本控制:分支和标签。每一种都不比另一种更好或更差,这取决于您的需要:

  1. 标签用于使用标签来标记时间点,以便您稍后能够在需要时返回到该点。
  2. 分支用于“复制”您的代码以便能够工作同时有两个版本.

因此,使用分支仅取决于您想要做什么。如果您必须同时处理多个不同的版本(例如每个客户端一个):除了使用分支之外,没有其他方法可以处理它。

要限制分支数量,您必须决定什么将是新分支或将用标签标记什么:客户端特定版本、主要版本、次要版本、Service Pack 等。

使用客户端版本的分支看起来是理所当然的。 对每个主要版本使用一个分支可能是您做出的最艰难的选择。如果您选择对所有主要版本仅使用一个分支,那么您将无法灵活地同时处理不同的主要版本,但您的分支数量将尽可能少。

最后,Jemery Thompson 有一个很好的观点,他说并非所有代码都应该依赖于客户端,有一些库(通常是最低级别的库)不应该针对每个客户端进行自定义。我们通常做的是为框架、横切、低级服务库使用单独的分支树(不是每个客户端)。然后在每个客户端版本项目中引用这些项目。

我给您的建议是对这些库使用 Nuget 并为它们创建 nuget 包,因为这是定义版本化依赖项的最佳方法。定义 Nuget 包以及设置本地 Nuget 服务器非常简单。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么是允许根据每个客户轻松定制产品的良好解决方案结构? 的相关文章

  • 在 MVC Core DI 中注册服务集合

    我有简单的策略课程 public class LinkQualifier ILinkQualifier private readonly IEnumerable
  • 微服务:有哪些优点和缺点?

    与其他架构相比 使用微服务有哪些优点和缺点 何时应该使用微服务有经验法则吗 Pros 萨姆 纽曼在构建微服务 https rads stackoverflow com amzn click com 1491950358 列举了微服务的主要优
  • 此代码中 Matlab 与 C++ 速度比较

    我编写了简单的 C 代码并在 C 中对其进行了测试 然后我通过以下方式为 MATLAB 调整了相同的代码mex file name cpp并在 MATLAB 中运行相同的代码 该代码使用与 C 相同的编译器 这是代码 int k for i
  • IoC容器中创建的对象可以称为Singleton吗?如果不是——为什么?

    IOC容器中创建的对象可以称为Singleton吗 如果可以 为什么 如果不可以 为什么 谁能用简单的语言详细解释一下 IOC 容器如何准确管理对象 你可以说 Spring 单例不是单例 Singleton有其有意义的作用域 spring
  • 使用 TEE 从 TFS 签出到 eclipse 的最佳方式是什么?

    我正在开发一个 QNX 应用程序 因此我使用旧版本的 Eclipse CDT C 等 到目前为止 我一直在使用 TFS 进行检查 然后通过 Import gt General gt ExistingProject 将项目文件导入到工作区 这
  • 微服务中的事务

    我读过一些关于微服务架构的文章 但没有人涉及事务的主题 他们都说这很难做到 也许有人可以描述如何处理这个问题 但不是从领域方面 而是从技术方面 假设我们有一个业务案例 我们需要调用两个不同的服务 并且它们都对数据库进行一些更改 但是如果第二
  • MVC3 RenderPartial 跨多个页面缓存

    谁能告诉我是否可以跨多个页面缓存 RenderPartial 我有一个用于用户配置文件的 RenderPartial 除非用户更新其配置文件 否则它实际上不会改变 所以我真的不想每次加载页面时都回去获取他 她的个人资料 我宁愿传递部分内容
  • 是否应该在使用 MVC 的每个视图中使用 ViewModel?

    我了解您使用 ViewModel 来存储来自其他模型和源的不同数据以在视图中使用 因为模型并不总是包含您想要的内容 我试图弄清楚为每个视图使用 ViewModel 是否合适 我问的原因是出于一致性原因 您可以有一个仅需要模型本身的视图 以及
  • ASP.Net MVC 在哪里从实体转换为视图模型?

    标题几乎解释了一切 这是我在我们的项目中尝试做的最后一件事 我们的结构是一个服务库 其中包含这样的功能
  • ASP.NET MVC - 服务层,每个控制器操作中的单个或多个服务?

    我开始在我的 MVC 项目中实现一个服务层 以精简一些臃肿的控制器 它也有存储库 工作单元模式 我的问题是 如果您的页面有一个复杂的视图模型 其中包含大量子对象等 并且在幕后有大量逻辑发生 让您了解原始开发人员编写的控制器有近 4000 行
  • 无法找到类型 [Microsoft.TeamFoundation.Build.Workflow.WorkflowHelpers]

    我正在尝试对来自指定进程参数的 Powershell 的构建进行排队 我收到以下错误 知道我做错了什么吗 无法找到类型 Microsoft TeamFoundation Build Workflow WorkflowHelpers 确保包含
  • Visual Studio 2010 在编辑器中按字母顺序对函数进行排序

    有谁知道如何在编辑器 c 中按字母顺序对类的函数进行排序 IE public class Foo public void B public void D public void A 排序后 类应该看起来像 public class Foo
  • 如何在 ASP.NET 中的 gridview 中为每个标题列添加标题

    我正在使用 ASP NET 我有一个 gridview 我需要在每个标题列中放置一个标题 标题将显示在移动 我必须将字段转换为 TemplateField 像这样的东西
  • 如何使用 TFS PowerShell 获取变更集和关联工作项的列表?

    我是 PowerShell 和 TFS cmdlet 的新手 我正在尝试检索区域路径中的变更集列表及其关联的工作项 我已经列出了自特定日期以来的变更集 Get TfsItemHistory Project Branch Version D0
  • 将两个工作区文件夹映射到同一工作目录

    我正在将构建系统从 VSS 迁移到 TFS VSS 解决方案的一部分将两个 VSS 项目中的选定文件获取到同一目录中 由于 TFS 强制您在获取之前显式设置工作文件夹 因此我不确定这是否有效 我在单独使用时遇到了问题工作空间彼此的工作目录重
  • 打开 bootstrap.min.css 导致 VS2010 崩溃

    知道为什么打开 bootstrap min css 的缩小版本会导致 VS2010 崩溃吗 对于非缩小文件不会发生这种情况 我知道 我知道 一个有效的解决方案可能是 不要在 VS2010 中打开 bootstrap min css 这与我告
  • 无法使用VS2010 SP1进入.NET框架源代码

    我按照步骤http blogs microsoft co il blogs arik archive 2010 07 12 step into net framework 4 0 source code aspx http blogs mi
  • Asp.Net MVC3 - 如何创建动态 DropDownList

    我发现了很多关于此的文章 但我仍然不知道到底如何做到这一点 我正在尝试创建自己的博客引擎 我有用于创建文章的视图 我首先使用 EF 和代码 现在我必须填写应添加文章的类别数量 但我想将其更改为下拉列表 名称为类别 我的模型看起来是这样的 p
  • 创建一个从系统托盘运行的程序

    我想创建一个从 Windows 右下角系统托盘运行的程序 但我不知道从哪里开始 有人可以告诉 告诉我在哪里查找和示例或使用什么命令 研究吗 Add a NotifyIcon到主窗口窗体 使用Resize事件在Form控制何时显示Notify
  • 更改Visual Studio 2010生成的exe文件的图标

    我目前正在 Visual Studio 2010 中创建一个应用程序 在构建项目以生成应用程序的输出后 我发现 exe 是使用默认图标构建的 有什么方法可以更改或使用我自己的图片作为 Visual Studio 2010 生成的 exe 文

随机推荐