如何构建我的解决方案以便为同一个存储库提供多个数据源?
我目前正在审核pluralsight course:
我的employee
实体有多个数据源,例如sql server数据库和CRM实例。
存储库模式是否允许同一存储库的多个数据源?
就我而言,我想通过在其周围包装一个Employee存储库来抽象对Employee实体的存储库访问,但我不确定我是否通过要求多个数据源来实现反模式相同的存储库
答案 0 :(得分:1)
存储库模式是否允许同一存储库的多个数据源?
存储库模式只是将数据源与代码的其余部分隔离开的好方法。将其视为建议以实现松散耦合的实现。之后没有这种模式的规则:你可以随意实现它,只要你没有泄漏数据的方式。
我不确定我是否通过为同一个存储库要求多个数据源来实现反模式。
不是!想想您的存储库将处理管理员工的管道。这样可以防止其他开发人员(甚至一旦代码库增长)调用所有十个不同的API来正确同步单个实体的所有数据源。因此,您可以安全地依赖一个有责任将您的员工保存到所有好位置的班级。
如何构建我的解决方案以便为同一个存储库提供多个数据源?
作为开发人员,这是一个有趣的部分 - 当你需要考虑实现时! :)在所有情况下,我强烈推荐一种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...
}
}
请注意,这两个类的范围为ìnternal
。这是因为我们不希望将这些实现暴露给我们的开发人员。他们需要一个API来保存员工。这是因为我们创建了一个存储库的agregator。这是公共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);
}
}
}
尽管如此,每个实现都有利有弊。这里的典型缺点是,如果存储库抛出异常,则数据源将不再对齐。还有许多其他方法,例如异步方法,其中单独的作业处理更新并控制异常,从而能够重新处理任何错误的记录。这取决于您可以花费多少时间以及这对您的业务至关重要。