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

l--*_*''' 1 .net c# rest model-view-controller repository-pattern

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

我目前正在复习复数课程

在此处输入图片说明

我的employee实体有多个数据源,例如 sql server 数据库以及 CRM 实例。

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

就我而言,我想通过将 Employee 存储库包装在 Employee 实体周围来抽象对 Employee 实体的存储库访问,但我不确定我是否通过要求同一个存储库的多个数据源来实现反模式。

Zen*_*ulz 5

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

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

我不确定我是否通过要求同一个存储库的多个数据源来实现反模式。

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

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

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

public interface IEmployeeRepository
{
   void Save(Employee employee);
}
Run Code Online (Sandbox Code Playgroud)

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

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

internal class DbEmployeeRepository
{
   void Save(Employee employee)
   {
      // Using Entity Framework...
   }
}
Run Code Online (Sandbox Code Playgroud)

请注意,这两个类的范围为ìnternal. 这是因为我们不想将这些实现暴露给我们的开发人员。他们需要一个 API 来拯救一名员工。这是因为我们创建了存储库的聚合器。这是公共 API(公开给开发人员的 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);
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

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