Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何为不同的客户定制web应用程序(页面和用户界面)

如何为不同的客户定制web应用程序(页面和用户界面)
EN

Software Engineering用户
提问于 2012-11-15 04:25:09
回答 4查看 3.2K关注 0票数 3

我们有一个ASP.NET网络应用程序,已经变得很难维护,我正在寻找关于如何重新设计它的想法。这是一个员工管理系统,可以为我们的每一个客户高度定制。现在让我解释一下它是如何工作的:

在默认页面上,我们有一个菜单,用户可以在该菜单中选择任务,例如创建员工或查看时间表。我将以为例。

当用户从菜单中选择Create时,将加载ASPX页面,其中包含所选菜单项的动态加载的用户控件,例如,对于Create,这将是AddEmployee.ascx。

如果用户单击控件上的Save,它将导航到默认页面。有些菜单项涉及多个步骤,因此如果用户单击多步骤流上的Next,它将导航到流中的下一个页面,以此类推,直到到达最后一步,单击Save导航到默认页面。

有些客户可能需要在Create流中增加一个步骤(例如SecurityClearance.ascx),但其他客户可能不需要。

不同的客户可能使用相同的ASCX用户控件,因此在AddEmployee.OnInit中,我们可以为该客户定制字段,即使某些字段隐藏、只读或强制。

以下是每个客户都可以定制的东西:

  • 菜单项
  • 每个流程中的步骤(ascx控件名称)
  • 每个ascx中的隐藏字段
  • 每个ascx中的强制字段
  • 与每个ascx相关的规则,这允许在该客户的代码中使用某些逻辑。

自定义保存在每个客户的一个庞大的XML文件中,这个文件可能长达7500行。

是否有任何框架或规则引擎,我们可以用这种方式定制我们的应用程序?其他应用程序如何管理每个客户的自定义?

EN

回答 4

Software Engineering用户

发布于 2012-11-14 13:07:57

如果您的常规数据保存在数据库中,我不完全确定为什么要将所有特定于客户的信息保存在xml文件中。把它移到数据库里。

接下来,有很多不同类型的规则引擎。考虑到您使用的是asp.net,您可能需要查看Workflow至少其中的一些内容。您可以阅读以下内容:http://karlreinsch.com/2010/02/05/microsoft-rule-engines/

很久以前,我使用了一个叫做Haley的产品来驱动一个c#网络应用程序。它控制着从屏幕到出现的字段的所有东西,以及它们是否是必需的。花了一段时间让团队了解它是如何工作的,但是一旦它发生了,就会产生一个新的客户非常简单。海利从那时起就被甲骨文吞食了,但可能是绝对最好的。

其他您可能感兴趣的是NxBRE,甚至nCalc。NxBRE是一个实际的规则引擎,它是为java构建的一个端口。另一方面,nCalc本身并不是一个规则引擎。但是,如果您可以用简单的布尔语句来表示您的逻辑,那么它是非常快的。我目前正在使用这个来驱动我们的应用程序中的页面流。

一些商业产品包括:FlexRuleiLog

票数 4
EN

Software Engineering用户

发布于 2012-11-15 03:51:28

您现有的规则引擎工具支持您的web应用程序,这意味着它已经满足您的需要。您可以使用其他“规则引擎”,如MS工作流,但它也可以以一个难以维护的情况结束。

假设有注册门户网站。它收集一般用户信息并保存到数据库中。很简单。我们使用多个ASCX为一个客户端构建一个产品,为另一个客户机构建Rules.Then,我们为这些ASCX添加更多的规则和更多的控件。以这种方式工作,迟早我们会到达最后一根稻草客户。当时,代码库很难维护,开发人员在许多规则中迷失了自己。这就是我身上发生的事。

所以对我来说,这与使用哪个规则引擎无关。

那怎么做?

我提出了一个问题,其中一个回答对我来说是有意义的(认为不是一个经过挑选的答案)。在这个答案中,那个人提到了你是什么样的公司。在你的问题中,这更像是你是哪个部门,或者你想分开你的开发团队。

如果您是首席技术人员团队的成员,请使用规则引擎构建一个框架。创建一个基本的注册门户作为示例portal.Make DAO,BO与UI (分离层)解耦。

如果您是一个定制团队,创建自定义用户控件(不要在基本版本中重用这些用户控件)。您将重新创建的只是UI,您仍然可以使用DAO、BO,因为它们不是在用户控件中定义的,它们位于其他层。通过这种方式,您可以自由地定义客户端指定的规则,而不必担心污染其他客户端规则或在其他客户注册中引入新的bug。

只是意识到这不像是对你问题的回答。无论如何,这是我的想法后,有限的xp工作引擎规则为基础,多客户端的web应用程序。

票数 3
EN

Software Engineering用户

发布于 2012-11-15 06:28:24

当单个客户的需求大不相同以至于共享功能仅占给定客户需求功能的50%以下时,那么实际上只有两种主要的方法来处理这个问题:

为每个客户端

编写自定义页面

对于技术人员以及商业和销售人员来说,这有时都是一个令人不快的选择。如果客户端意识到您正在执行大量的自定义开发以满足他们的需求,这也可能令人不快。

技术考虑

作为一名开发人员,高可维护性是我们应该努力实现的核心目标之一,因此为单个客户编写自定义页面与此目标背道而驰。假设必须添加一个应该影响所有客户的公共功能,现在必须为所有客户端手动实现此更改,并对每个对该页面具有独立实现的客户端进行测试。如果你有很多客户,那么随着时间的推移,这可能是站不住脚的。

业务考虑事项

从作为ISV的业务角度来看,我们喜欢构建一个产品,它通常比软件本身所涉及的更多。销售软件产品意味着,作为一个供应商,我们有一个可以满足所有客户需求的包,只需对产品的核心进行最小到不定制。

当需要进行产品自定义以容纳客户时,产品可能是不合适的,或者只是计划得很差。也许,正在出售的解决方案实际上根本不能被认为是一种产品,而只是简单地以这种方式进行营销。软件业务可能会像这样棘手,这也是为什么产品所有者和销售人员赚大钱的原因,因为成功销售软件的成功公式可能非常棘手。如果你没有正确地营销它,或者正确地形成一个产品的概念,那么你可能不会销售,或者你可能会出售,并且无法兑现承诺。

客户端考虑事项

所有的客户都喜欢感觉自己得到了一笔很好的交易,当他们购买软件产品时,他们想要相信他们的所有需求都是现成的。这就是为什么软件产品比定制的软件开发更容易销售的原因,即使客户端的需求本质上是如此具体,以至于任何这样的产品都不可能存在。

如果客户发现您只为他们的需求执行了大量的定制软件开发,那么他们就不再相信您的产品曾经有能力交付,而且他们最终会为此付出高昂的代价来支付这些定制开发成本。

这是什么时候的好主意

如果该软件是在一个利基市场的少量客户和有限的增长机会,那么定制网页开发的具体功能可能是最好的选择。

基于

XML的布局和规则引擎

基本上,您将识别要构建到页面中的核心功能,任何特定于客户的功能都应该通过自定义布局和规则引擎来定义,该引擎允许客户端需要在代码库之外进行自定义。这方面的技术设计考虑是:

技术考虑

此时,客户端需要通过XML进行模式更改,而不是对代码更改进行昂贵的可维护性噩梦。通过XML来控制布局来定义您的视图,XML来绑定您的模型,以及定义您的控制器的规则将允许一个坚实的体系结构,它将随着您的业务的增长而扩展,并保持松散耦合、高内聚性和高可维护性。这些XML文档可以很容易地通过NoSQL或甚至传统的关系数据库系统维护。

业务考虑事项

限制有针对性的发布,以容纳客户,增强了整个产品的力量和可伸缩性,并使企业相信他们有能力在一个狂野和动荡的市场中快速增长。一些缺点是应用程序和产品本身的复杂性增加,以及对增加初始开发时间的考虑以及与此相关的更高成本。

客户端考虑事项

客户可以有信心,他们的需求是通过产品得到满足,没有明显的裁剪,他们的要求和变化可以迅速适应。

票数 2
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/175941

复制
相关文章
如何为Spark应用启用Kerberos的Debug日志
在CDH集群启用了Kerberos后,在执行Spark作业时难免会遇到由于Kerberos认证问题导致作业运行失败的时候,那我们需要针对Spark作业进行调试,通过一些Debug日志查看认证失败的原因。本篇文章Fayson主要介绍如何为Spark的Driver和Executor的JVM启用Kerberos的Debug日志。
Fayson
2018/11/16
2.4K0
如何为Hive2启用Kerberos认证
温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。 Fayson的github: https://github.com/fayson/cdhproject 提示:代码块部分可以左右滑动查看噢 1.文档编写目的 ---- 在前面的文章Fayson介绍了《如何在CDH集群中安装Hive2.3.3》,本篇文章Fayson主要介绍如何为已安装好的Hive2服务启用Kerberos认证。 内容概述: 1.部署环境说明 2.添加Kerberos配置 3.验证Kerberos认证 4.总结 测试环境: 1.C
Fayson
2018/07/12
2.8K0
如何为 .NET CLI 启用 Tab 自动补全
本文介绍了如何为四种 shell(PowerShell、Bash、zsh 和 fish)配置 Tab 自动补全。 对于其他 shell,请参阅相关文档,了解如何配置 tab 自动补全。
用户4268038
2022/01/05
9820
记录日志
日志级别:debug<info<warn<error application.yml配置日志 logging: file: target/app.log level: ROOT: WARN cn.devmar: TRACE import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class SampleClass{ private static
华创信息技术
2019/11/08
7810
日志记录
访问应用服务器的请求都需要拥有一定权限,如果说每访问一个服务都需要验证一次权限,这个对效率是很大的影响。可以把权限认证放到 API 网关来进行。目前比较常见的做法是,用户通过登录服务获取 Token,把它存放到客户端,在每次请求的时候把这个 Token 放入请求头,一起发送给服务器。API 网关要做的事情就是解析这个 Token,知道访问者是谁(鉴定),他能做什么/访问什么(权限)。说白了就是看访问者能够访问哪些 URL,这里根据权限/角色定义一个访问列表。如果要实现多个系统的 OSS(Single Sign On 单点登录),API 网关需要和 CAS(Central Authentication Service 中心鉴权服务)做连接,来确定请求者的身份和权限。
用户1880875
2021/09/07
1.2K0
如何在不重启Yarn服务的情况下启用DEBUG日志记录
为了解决Yarn问题,需要为不同的服务启用调试。但是,在生产集群中,可能无法立即重启Yarn服务。本篇文章Fayson主要介绍如何在不重启Yarn服务的情况下为ResourceManager、JobHistory等服务启用DEBUG级别日志记录。
Fayson
2018/10/23
1.7K0
如何在不重启Yarn服务的情况下启用DEBUG日志记录
MongoDB日志记录
为了在发生故障时提供持久性,MongoDB使用预写日志记录到磁盘journal文件中。
MongoDB中文社区
2020/11/11
2.8K0
MongoDB日志记录
mysql日志记录
log-bin = /path/mysql-bin #其记录日志文件名为mysql-bin.index,mysql-bin.000001(注:重启或者单个文件超出限制会+1)
93年的老男孩
2019/12/18
4.7K0
python 日志记录
#!/bin/env python #--*-- coding=utf8 --*-- # # Author: ablozhou # E-mail: ablozhou@gmail.com # # Copyright 2010 ablozhou # # Distributed under the terms of the GPL (GNU Public License) # # hzdq is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # 2010.3.14 写文件,log级别常数定义 import datetime import sys import traceback import codecs import types #log编码全部按utf8处理 loglevels = {'stdout':['info','debug','warn','error','fatal'], 'file':['info','debug','warn','error','fatal'] } logfile = 'logs.txt' class log4py: def __init__(self,modulename='gloabal', loglevel=loglevels, filename='log4py.txt'): self.filename = filename #self.flag = set(loglevel['stdout']+loglevel['file']) self.loglevel = loglevel self.modulename = modulename self.fcname = None class function(): def __init__(self,fcname,parent): parent.debug('enter ',fcname) self.fcname = fcname self.parent = parent def __del__(self): self.parent.debug('exit ',self.fcname) def dbgfc(self,fcname): '''set debug function name''' f = None if 'debug' in self.flag: f = self.function(fcname,self) return f def _gettime(self): return datetime.datetime.now().isoformat() def outstd(self,*fmt): s = self.fmtstr(*fmt) print s def outfile
py3study
2020/01/03
9070
[CodeIgniter4]-记录日志信息
你可以通过 log_message() 方法将信息记录在本地日志文件中,并且必须在第一个参数中指定错误的”级别”,来表明这个信息的类型(debug,error等)。 第二个参数就是信息本身:
landv
2020/03/05
1.3K0
如何为Ubuntu Dock图标启用最小化点击功能?
我们可以将我们最喜欢和最常用的应用程序固定在Dock上,以便在Ubuntu 18.04 LTS桌面中快速启动它们。默认情况下,Ubuntu Dock位于桌面的左侧。但是,您可以将其移动到屏幕的顶部、底部和右侧。
会长君
2023/04/25
1.7K0
【Java AWT 图形界面编程】AWT 简介 ( AWT 核心类继承体系 )
Java 中 使用 AWT 和 Swing 进行 图形界面开发 , AWT 是 抽象窗口工具集 , Abstract Window Toolkit , AWT 功能比较简单 , Swing 提供了更加丰富的界面组件库 ;
韩曙亮
2023/03/30
6780
【错误记录】Java AWT 图形界面编程报错 ( Exception in thread “main“ java.awt.AWTError: BoxLayout can‘t be shared )
尝试使用 Panel 实现线性布局 , 为 Panel 设置 BoxLayout 布局管理器 ;
韩曙亮
2023/03/30
6580
【错误记录】Java AWT 图形界面编程报错 ( Exception in thread “main“ java.awt.AWTError: BoxLayout can‘t be shared )
【说站】mysql Binlog日志如何启用
启用binlog,通过配置 /etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf 配置文件的 log-bin 选项:
很酷的站长
2022/11/23
1.6K0
Laravel 记录SQL日志
Laravel 默认只在sql语法错误时提示完整的sql日志,但实际情况接口慢,筛选条件和预期不符等,都需要看到sql语句,通过sql语句判断问题所在
崔哥
2023/01/01
1.6K0
SpringBoot AOP 记录操作日志、异常日志
我们在做项目时经常需要对一些重要功能操作记录日志,方便以后跟踪是谁在操作此功能。在操作某些功能时也有可能会发生异常,但是每次发生异常要定位原因都要到服务器去查询日志才能找到,这样也不能对发生的异常进行统计。我们可以在需要的方法中增加记录日志的代码,和在每个方法中增加记录异常的代码,最终把记录的日志存到数据库中。
默存
2022/06/24
3.3K1
SpringBoot AOP 记录操作日志、异常日志
日志记录规范总结
然而,日志记录的好坏直接关系到系统出现问题时定位的速度。同时,我们可以通过对日志的观察和分析,提前发现系统可能的风险,避免线上事故的发生。对于服务端开发人员来说,线上日志的监控尤其重要,能够帮助我们第一时间发现线上问题并及时解决。
江不知
2019/12/12
4K0
日志记录规范总结
Redis 错误日志记录
日志描述:(错误)misconf redis被配置以保存数据库快照,但misconf redis目前不能在硬盘上持久化。用来修改数据集合的命令不能用,请使用日志的错误详细信息。
郭顺发
2023/07/07
2.1K0
aop记录登录日志
在网站或者各种软件系统中,多多少少会有一些日志需要我们来记录,从而查看当前系统的运行状态。
时光潜流
2023/10/22
3310
异步记录PHP日志
1, 'message' => '请求成功'); echo json_encode($result); $message = '这是变量内容'; //投递日志开始,只有FPM模块才有 if(function_exists('fastcgi_finish_request')) { fastcgi_finish_request(); } sleep(1);//即使加了sleep也不影响原有逻辑执行 file_put_contents('/tmp/log.txt', date('Y-m-d H:i:s'
苦咖啡
2018/04/28
2.1K0

相似问题

如何为@RestController启用日志记录?

22

如何为OpenCV启用日志记录

2115

如何为Spring Security启用日志记录?

640

如何为Apache FtpServer启用日志记录

10

如何为子进程启用日志记录

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文