2017-03-12 26 views
0

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

我目前正在审查pluralsight course

enter image description here

employee实体有多个数据源,如SQL Server数据库以及一个CRM实例。

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

在我的情况下,我想通过在它周围包装一个Employee资源库来抽象对Employee实体的资源库访问权限,但我不确定是否通过要求多个数据源来实现反模式同一个存储库

回答

0

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

存储库模式只是将数据源与代码的其余部分分离的良好实践。看到它像建议有一个松散耦合的实现。之后没有这种模式的规则:只要您不泄露数据的方式,您可以随意实施它。

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

这不是!认为你的存储库会处理管理你的员工的管道。这将阻止其他开发人员(甚至是代码库增长的人)认为要调用所有十个不同的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(暴露给开发者的)。这种方法也尊重单一责任原则,因为此实施仅协调其他存储库。

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

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

相关问题