我有一个两部分的应用程序。一部分是一个 Web 应用程序 (C# 4.0),它在具有托管 MSSQL 数据库的托管计算机上运行。这很好,很标准。另一部分是一个 Windows 应用程序,它在我们的网络上本地运行并访问我们的主数据库 (Advantage) 和 Web 数据库。该网站无法访问 Advantage 数据库。
目前此设置工作正常(只要网络正常),但我们现在正在重建网站并将其从 Web Forms /.NET 2.0 / VB 站点升级到 MVC3 / .NET 4.0 / C# 站点. 作为重建的一部分,我们添加了许多新表,其中内部数据库包含所有数据,Web 数据库包含其中的一个子集。
在内部应用程序中,数据库中的表由类表示,这些类使用反射和属性标志来填充自己。例如:
[AdvantageTable("warranty")]
public class Warranty : AdvantageTable
{
[Advantage("id", IsKey = true)]
public int programID;
[Advantage("w_cost")]
public decimal cost;
[Advantage("w_price")]
public decimal price;
public Warranty(int id)
{
this.programID = id;
Initialize();
}
}
AdvantageTable 类的 Initialize() 方法使用反射基于所有键及其值构建查询,然后根据指定的数据库列填充每个字段。更新的工作方式类似——我们在任何一个对象上调用 AdvantageTable.Update(),它处理所有的数据库写入。它工作得很好,隐藏了所有标准的 CRUD,并让我们在添加新表时快速创建新类。我们宁愿不改变它,但如果有需要它的解决方案,我不会完全排除它。
Web 数据库需要有这个表,但不需要成本数据。我可以创建一个由 Web 数据库支持的单独类(通过存储过程、反射、LINQ-TO-SQL、ADO 数据对象等),但保修对象中可能还有其他功能,我希望以相同的方式运行无论是从网站调用还是从内部应用调用,都不需要维护两套代码。例如,我们可能会改变我们决定对产品适用何种保修的逻辑——我希望只需要在一个地方而不是两个地方创建和测试它。
所以我的问题是:谁能想到一个好方法来允许这个类有时从 Advantage 数据库中填充,有时从 Web 数据库中填充? 这不仅仅是连接字符串的问题,因为它们有两种非常不同的访问方法(甚至除了反射之外)。我考虑将[Web("id")]
类型标签添加到 Advantage 标签中,并且只将它们放在 Web 数据库中存在的字段上以指定其列,然后使用某种开关来控制用于读取/写入的逻辑集,但我感觉那会很痛苦(这种方法对网络安全吗?如何在实例化之前设置标志?)。所以我没有我喜欢的想法,并怀疑有一个我什至不知道存在的解决方案。有输入吗?