c# - 构建通用应用程序 - 允许客户特定的选项

标签 c# oop design-patterns architecture

我构建了一个开源应用程序,我很想知道其他人如何处理客户特定的请求。保持应用程序简单对我来说很重要;我并不是要让所有人都拥有一切。应用程序可能会变得臃肿、复杂,而且几乎无法使用。但是,有一些特定于客户的选项会很好(只是不适用于所有客户)。例如……

假设我们有一个名为 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/

相关文章:

c# - Fluent Nhibernate 映射 hasMany

c# - 如何将 nullable int 转换为 nullable short?

oop - 使用子类中定义的静态方法进行排序

java - 导入和扩展

c# - 我应该使用命令模式而不是调用静态方法吗?

design-patterns - 使用敏捷方法或其他方式编写松散耦合代码的建议

c# - 在数据库中插入多条记录的最快方法

c# - 如何设置连接字符串,我只更改一个地方?

c# - 简单类+工厂的通用解决方案

c# - IoC/DI 容器、工厂和运行时类型创建