2017-03-12 22 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); 
     } 
    } 
} 

儘管如此,每個實現都有優點和缺點。這裏的一個典型缺點是,如果存儲庫拋出異常,則數據源將不再對齊。還有很多其他方法,例如異步方法,其中單獨的作業處理更新並控制異常,從而能夠重新處理任何錯誤的記錄。這取決於你可以花費多少時間,以及這對你的業務至關重要。

相關問題