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

标签 c# .net rest model-view-controller repository-pattern

<分区>

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

我目前正在审查 pluralsight course :

enter image description here

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

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

在我的例子中,我想通过围绕它包装一个 Employee 存储库来抽象对 Employee 实体的存储库访问,但我不确定我是否通过为同一个存储库要求多个数据源来实现反模式.

最佳答案

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 来正确同步单个实体的所有数据源。因此,您可以安全地依赖一个类,该类负责将您的员工保存到所有合适的位置。

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

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

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...
   }
}

请注意,这两个类的作用域都是ìinternal。这是因为我们不想将这些实现公开给我们的开发人员。他们需要一个单一的 API 来拯救一名员工。这是因为我们创建了一个存储库聚合器。这是公共(public) 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);
      }
   }
}

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

关于c# - 如何构建解决方案以允许存储库的多个数据源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42751146/

相关文章:

asp.net - 我的 API 中只有一个 Get 有效

c# - 如何在 WCF 中返回 IEnumerable ?现有连接被远程主机强制关闭

c# - 在一个 uiview 图像动画完成后触发一个事件以在动画中进行动画处理(单触摸)

.net - Regex.Replace 中的 "or"运算符是否有理论表达式大小限制

java - Spring -OAUTH2.0 : No resource available error on calling/oauth/token

web-services - 在虚拟机上通过Jersey部署REST服务时出错

c# - System.Object 的 BaseType 应该和接口(interface)一样吗?

c# - 列表框项目面板样式

c# - WebDriverWait 如何等到项目存在或不存在?

C#:如何从 GAC 加载程序集?