C# 为单个对象使用多个数据源构建应用程序
我正在努力为我的应用程序架构找到合适的解决方案。对于我的应用程序,我为客户提供了一个单独的类。填充my customer对象的数据分布在多个不同类型的数据源上。主要部分在只读Oracle数据库中公开,其他部分使用webservices公开,我需要将一些额外数据保存到另一个数据源(例如使用entityframework的MS SQL数据库),因为我对大多数数据源只有只读权限(它们在其他地方管理) 出于这个原因,我想构建一种中央库,它带有连接到我所有数据源的连接器,用于创建一个要使用的集中式客户对象。到目前为止,这个想法还不错(我认为),但我找不到任何文档或最佳实践的例子来实现这样的解决方案C# 为单个对象使用多个数据源构建应用程序,c#,design-patterns,C#,Design Patterns,我正在努力为我的应用程序架构找到合适的解决方案。对于我的应用程序,我为客户提供了一个单独的类。填充my customer对象的数据分布在多个不同类型的数据源上。主要部分在只读Oracle数据库中公开,其他部分使用webservices公开,我需要将一些额外数据保存到另一个数据源(例如使用entityframework的MS SQL数据库),因为我对大多数数据源只有只读权限(它们在其他地方管理) 出于这个原因,我想构建一种中央库,它带有连接到我所有数据源的连接器,用于创建一个要使用的集中式客户对象
EXAMPLE:
* Main Application (multiple applications)
- Central Business Logic Layer (Business-API)
* Webservice Connector
* Oracle Connector
* EntityFramework Connector
有人知道在这个特定的主题上有没有好的阅读材料吗
Kind This您描述的客户对象的具体问题听起来很像由解决的问题,这在技术上是一种。引述: 数据映射器是一个数据访问层,它在持久数据存储(通常是关系数据库)和内存数据表示(域层)之间执行双向数据传输。该模式的目标是使内存中的表示和持久数据存储彼此独立,并使数据映射器本身独立。图层由一个或多个映射器(或数据访问对象)组成,执行数据传输。映射器实现的范围各不相同。通用映射器将处理许多不同的域实体类型,专用映射器将处理一种或几种 尽管上述问题的语言提到了一个单一的持久数据存储,但没有理由说它不能是多个数据位置(中介模式对协作者隐藏了细节)
此模式有一个扩展,称为:我建议DAO模式从任何数据访问中抽象出来。业务逻辑不应该知道任何数据源。这是最重要的目标。任何其他内容都必须是从属的。您可以创建一个接受以下数据源的构造函数:
public class Customer
{
public Customer(OracleConnector oracle, WebSerivceConnector webservice, EntityConnector entity)
{
this.oracle = oracle;
this.webservice = webservice;
this.entity = entity;
}
public void Fetch()
{
// fetch data from oracle, webservice, and entity.
this.Name = oracle.GetCustomerName();
}
}
这样,只有客户
知道如何获取数据,所有逻辑都在一个地方。通过为连接器创建接口,甚至可以使其更易于测试,耦合更少
public interface IOracleConnector
{
// add something here
string GetCustomerName();
}
public class OracleConnector
: IOracleConnector
{
// add the implementation here.
}
然后将
Customer
构造函数更改为acceptsIOracleConnector
如下:
public Customer(IOracleConnector oracle, WebSerivceConnector webservice, EntityConnector entity)
{
// your code here.
}
现在,,您可以创建一个模拟来测试
客户
,而无需实际连接到数据库。难道您不能实现一个IRepository模式,GET从每个数据库上下文返回您的集合数据模型吗?我同意@JacobRoberts的观点-最好的方法是为不同的数据实现存储库模式来源。请务必先阅读本文,但我是否看到了解技术(WebService)甚至产品(Oracle)的业务对象?您不应该混合使用不同的抽象级别。IOracleConnector
只是一个接口,所以客户只知道其中定义的合同。如果OP计划将来更改存储引擎,他可以创建一个实现IOracleConnector
的新类,如WhateverConnector
和Customer
将继续工作。