我构建了一个开源应用程序,我很想知道其他人如何处理客户特定的请求。保持应用程序简单对我来说很重要;我并不是要让所有人都拥有一切。应用程序可能会变得臃肿、复杂,而且几乎无法使用。但是,有一些特定于客户的选项会很好(只是不适用于所有客户)。例如……
假设我们有一个名为 Server 的域实体。在 UI 中,我们让客户从服务器列表中进行选择。对于一家公司而言,按位置(美国、德国、法国等...)过滤服务器很有帮助。添加这样的服务器属性会很容易:
public class Server
{
public Location Location { get; set; }
// other properties here
}
我担心的是,随着时间的推移,服务器可能会因属性而变得臃肿。即使我只添加位置,也不是所有客户都会关心该属性。
一个选项是允许用户定义的字段:
public class Server
{
public string UserField1 { get; set; }
public string UserField2 { get; set; }
public string UserField3 { get; set; }
// etc...
// other properties here
}
这是处理这个问题的最佳方式吗?我不喜欢通过将所有内容都变成字符串来消除类型安全这一事实。人们是否有其他/更好的方式来处理这样的问题?甚至有这样的设计模式吗?
最佳答案
在我看来,一个好的设计模式是在数据库级别使用模式,然后在类级别使用基本继承。
CREATE TABLE dbo.A (
ColumnA INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
ColumnB VARCHAR(50),
ColumnC INT,
etc.
)
现在我们有一个客户需要一些特定的功能,所以让我们在不同的模式中创建这个表的扩展:
CREATE TABLE CustomerA.A (
ColumnA INT NOT NULL PRIMARY KEY,
Location VARCHAR(50)
)
但是现在我们有另一个客户需要以不同的方式扩展它:
CREATE TABLE CustomerB.B (
ColumnA INT NOT NULL PRIMARY KEY,
DataCenterID INT
)
虽然字段可能不相关,但您明白了,所以现在我们需要在此处构建客户特定的领域模型:
public abstract class A
{
public int ColumnA { get; set; }
public string ColumnB { get; set; }
public int ColumnC { get; set; }
}
public class CustomerA_A : A
{
public string Location { get; set; }
}
public class CustomerB_A : A
{
public int DataCenterID { get; set; }
}
现在,当我们需要为客户 A 构建一些东西时,我们将构建他们的子类,并为客户 B 构建他们的子类,依此类推。
现在,仅供引用,这是一个非常动态的系统的开始。我这么说是因为缺少的部分,还不是动态的,是用户界面。有很多方法可以完成,但超出了这个问题的范围。这是你必须考虑的事情。我这么说是因为您管理接口(interface)的方式将决定您甚至知道要构建哪个子类。
希望对您有所帮助。
关于c# - 构建通用应用程序 - 允许客户特定的选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13731918/