如何构建解决方案以允许存储库的多个数据源

how to structure solution to allow for multiple data sources for a repository

如何构建我的解决方案以便允许同一存储库有多个数据源?

我目前正在查看 pluralsight course

我的 employee 实体有多个数据源,例如 sql 服务器数据库和 CRM 实例。

存储库模式是否允许同一个存储库有多个数据源?

在我的例子中,我想通过将员工存储库包装在它周围来抽象对员工实体的存储库访问,但我不确定我是否通过要求多个数据源来实现反模式相同的存储库。

Does the repository pattern allow for multiple data sources for the same repository?

存储库模式只是一种将数据源与代码的其余部分隔离开来的良好做法。将其视为 建议 以实现松散耦合。这种模式之后没有规则:你可以随意实现它,只要你不泄漏你从中获取数据的方式。

I am not sure if I'm implementing an anti-pattern by requiring multiple data sources for the same repository.

不是!认为您的存储库将处理管道以管理您的员工。这将阻止其他开发人员(甚至是代码库增长后的您)考虑调用所有十个不同的 API 来正确同步单个实体的所有数据源。因此,您可以放心地依靠一个 class 负责将您的员工保存到所有好的位置。

How can I structure my solution in order to allow multiple data sources for the same repository?

这是有趣的部分,作为开发人员 - 您需要考虑实施的时刻! :) 在所有情况下,我都强烈推荐 SOLID 方法。当您要添加甚至编辑您的解决方案时,这将对您有很大帮助。假设我们有一个存储库合同。

public interface IEmployeeRepository
{
   void Save(Employee employee);
}

实现可以是协调保存操作的主存储库。例如,我们需要更新 CRM 和数据库中的员工。我们可以有两种不同的实现,所以我们尊重单一职责原则:

internal class CrmEmployeeRepository
{
   void Save(Employee employee)
   {
      // Using a Web API...
   }
}

internal class DbEmployeeRepository
{
   void Save(Employee employee)
   {
      // Using Entity Framework...
   }
}

请注意,这两个 class 的范围是 ìnternal。这是因为我们不想将这些实现公开给我们的开发人员。他们需要一个 API 来拯救一名员工。这是因为我们创建了一个存储库聚合器。这就是public API(暴露给开发者的那个)。这种方法也遵循单一责任原则,因为这种实现只协调其他存储库。

public class AgregateEmployeeRepository
{
   private IEnumerable<IEmployeeRepository> _repositories;

   public AgregateEmployeeRepository(...)
   {
      // Can be injected manually or with an IoC...
   }

   void Save(Employee employee)
   {
      foreach(IEmployeeRepository repo in _repositories)
      {
         _repos.save(employee);
      }
   }
}

尽管如此,每种实施都有利有弊。这里的一个典型缺点是,如果存储库抛出异常,则数据源将不再对齐。还有很多其他方法,例如异步方法,其中一个单独的作业处理更新并控制异常,从而能够重新处理任何错误的记录。这取决于您可以花在上面的时间以及这对您的业务有多重要。