C# 为单个对象使用多个数据源构建应用程序

C# 为单个对象使用多个数据源构建应用程序,c#,design-patterns,C#,Design Patterns,我正在努力为我的应用程序架构找到合适的解决方案。对于我的应用程序,我为客户提供了一个单独的类。填充my customer对象的数据分布在多个不同类型的数据源上。主要部分在只读Oracle数据库中公开,其他部分使用webservices公开,我需要将一些额外数据保存到另一个数据源(例如使用entityframework的MS SQL数据库),因为我对大多数数据源只有只读权限(它们在其他地方管理) 出于这个原因,我想构建一种中央库,它带有连接到我所有数据源的连接器,用于创建一个要使用的集中式客户对象

我正在努力为我的应用程序架构找到合适的解决方案。对于我的应用程序,我为客户提供了一个单独的类。填充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
构造函数更改为accepts
IOracleConnector
如下:

public Customer(IOracleConnector oracle, WebSerivceConnector webservice, EntityConnector entity)
{
    // your code here.
} 

现在,,您可以创建一个模拟来测试
客户
,而无需实际连接到数据库。

难道您不能实现一个IRepository模式,GET从每个数据库上下文返回您的集合数据模型吗?我同意@JacobRoberts的观点-最好的方法是为不同的数据实现存储库模式来源。请务必先阅读本文,但我是否看到了解技术(WebService)甚至产品(Oracle)的业务对象?您不应该混合使用不同的抽象级别。
IOracleConnector
只是一个接口,所以客户只知道其中定义的合同。如果OP计划将来更改存储引擎,他可以创建一个实现
IOracleConnector
的新类,如
WhateverConnector
Customer
将继续工作。