好的,标题很长,但问题出在这里:
我有大约10-12个不同的对象,我必须在我的软件中使用它们。这很容易,我只是创建课程并做任何我想做的事情。但是,所有这些代表数据库行和主要问题的类 - 我的软件必须能够从/向不同的数据库(oracle,mysql,interbase,postgres,firebird)读取/写入这些对象。对象存储在不同的数据库中,甚至存储在不同字段(名称和类型)的不同表中[以及所有这些,因为这些数据库不会在它们之间同步]。
所以我在编写代码以提供所有工作时遇到了麻烦:我们认为它是大约5个数据库* 10个对象= 50个类,以及将来的扩展......
有人能告诉我正确的方法,最佳实践,如何构建这个?
答案 0 :(得分:3)
首先,编写您的类以包装所有这些调用不同的数据库。 您可能会使用数据库提供的数据提供程序连接到每个数据提供程序。
此驱动程序使用ado.net提供了一系列用于处理数据库的类。 在wrap类上使用此类,以导入/导出数据。通常这个数据提供者 有办法将数据库类型映射到.net clr类型。
而且,您必须发现每个数据库的关键点,例如: 有问题的数据库存储表,表字段,索引,键的信息..
修改强>
现在,您可以开始导入/导出操作。
例如,假设您正在从oracle读取并写入sql。
请参阅:
答案 1 :(得分:2)
对象存储在不同的数据库中,甚至存储在不同字段(名称和类型)的不同表中
如果字段的名称不同,则需要将字段映射到dataaccess级别的对象。无需创建50个类。 10个就够了。当您从数据库中读取数据时,将其映射到类并在应用程序中使用该类。同样,当您要保存数据时,您应该从同一个数据库中读取字段并相应地传递给数据库。
答案 2 :(得分:1)
我会通过以下方式达到您的要求:
首先,我会添加一些dbml
(Linq2SQL)文件,每个数据库一个。如果您愿意,可以使用ADO.NET或其他东西。您必须以不同方式调用生成的数据对象......如MySqlDataObject,OracleDataObject,FirebirdDataObject等。
在您的UI中,您只需要一组数据对象。因此,在您的数据层中,您将需要填充来自不同数据库的每个数据对象的方法......例如CopyToMySqlDataObject(ClrDataObject clrDataObject)
,CopyToOracleDataObject(ClrDataObject clrDataObject)
,CopyToFirebirdDataObject(ClrDataObject clrDataObject)
。
最后,我将使用引用所有数据源对象的DataProvider
类。此类将托管每个可用的操作,并在每个方法中调用每个数据源。看一下这个例子:
public int UpdateDataObject(ClrDataObject clrDataObject)
{
using (MySqlDataContext dataContext = new MySqlDataContext())
{
MySqlDataObject mySqlDataObject = dataContext.MySqlDataObjects.Where(d =>
d.Id == clrDataObject.Id).FirstOrDefault();
CopyToMySqlDataObject(clrDataObject, mySqlDataObject);
dataContext.SubmitChanges(ConflictMode.FailOnFirstConflict);
return 0;
}
...
using (OracleDataContext dataContext = new OracleDataContext())
{
OracleDataObject oracleDataObject = dataContext.OracleDataObjects.Where(d =>
d.Id == clrDataObject.Id).FirstOrDefault();
CopyToOracleDataObject(clrDataObject, oracleDataObject);
dataContext.SubmitChanges(ConflictMode.FailOnFirstConflict);
return 0;
}
}
答案 3 :(得分:1)
每个存储库的存储库模式和单一责任,以及可能是调用每个特定存储库类的通用存储库。
每个数据库都有一个存储库类,负责处理该数据库。
因此,如果您有一个客户类(可能是存储库级别的DTO),并且具有名为Name的属性,则每个存储库都负责读取" name"从相应的表中的字段然后将其映射到DTO名称字段,您不应该为每个数据库设置不同的域级别客户类,这只是坚果......
如果您正在使用依赖注入,您可以注入这些存储库,并在不需要时安全地逐个删除它们......
如果您需要事务支持,那么您可以在存储库中添加另一个层并滚动您自己的事务协调器等。
上面的@Sheridan示例的问题是当您添加和删除方法不断变化的数据库时,它不会因修改而关闭...