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

时间:2015-05-12 14:37:52

标签: c# design-patterns

我正努力为我的应用程序架构找到合适的解决方案。对于我的应用程序,我为客户提供单一课程。用于填充客户对象的数据分布在多种不同类型的数据源上。主要部分暴露在只读Oracle数据库中,其他部分使用Web服务公开,我需要将一些额外数据保存到另一个数据源(例如使用entityframework的MS SQL数据库),因为我只拥有大多数数据的只读权限(它们)在其他地方管理。)

出于这个原因,我想构建一种带有所有数据源连接器的中央库,以创建一个集中的客户对象来使用。到目前为止,这个想法非常好(我认为),但我找不到任何文档或最佳实践示例如何实现这样的解决方案。

EXAMPLE:
  * Main Application (multiple applications)
     - Central Business Logic Layer (Business-API)
         * Webservice Connector
         * Oracle Connector
         * EntityFramework Connector

有谁知道这个特定主题是否有一些好的阅读材料?

亲切的问候

3 个答案:

答案 0 :(得分:0)

您使用客户对象描述的具体问题听起来很像Data Mapper pattern解决的问题,技术上是Mediator。引自Wikipedia page for Data Mapper

  

数据映射器是一种数据访问层,它在持久数据存储(通常是关系数据库)和内存数据表示(域层)之间执行数据的双向传输。模式的目标是保持内存表示和持久数据存储彼此独立以及数据映射器本身。该层由一个或多个映射器(或数据访问对象)组成,执行数据传输。映射器实现的范围不同。通用映射器将处理许多不同的域实体类型,专用映射器将处理一个或几个。

虽然上述问题的语言提到了持久性数据存储,这是单数,但没有理由说它不能成为多个数据位置(Mediator)模式隐藏协作者的详细信息。)

此模式有一个扩展名,称为Repository pattern

答案 1 :(得分:0)

我建议DAO-Pattern从任何数据访问中抽象出来。业务逻辑不应该知道任何数据源。这是最重要的目标。其他任何东西都必须是从属的。

答案 2 :(得分:0)

您可以创建一个接受数据源的构造函数,如:

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();
    }
}

这种方式只有Customer知道如何获取数据,所有逻辑都在一个地方。您甚至可以通过为连接器创建接口来使其更易于测试并减少耦合。

public interface IOracleConnector
{
    // add something here
    string GetCustomerName();
}

public class OracleConnector
    : IOracleConnector
{
    // add the implementation here.
}

然后将Customer构造函数更改为接受IOracleConnector,如:

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

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