2013-10-15 77 views
1

我已經實現了存儲庫模式。我有我的基礎模型類,它們不過是標準的C#類。我有我的每個模型的存儲庫類。我有我的DbContext類。我使用的是Ninject,所以除了我的模型之外,所有的東西都首先被定義爲接口。眼下,訪問我的數據,我的代碼看起來是這樣的:如何從單個存儲庫轉換到服務層?

using (var context = m_kernel.Get<IPortalContext>()) 
{ 
    var accounts = m_kernel.Get<IAccountRepository>(new ConstructorArgument("context", context)); 

    foreach (var account in accounts.All()) 
    { 
     Assert.IsNotNull(account); 
    } 
} 

注:我不知道是否有更好的方法來說,我想通過這一背景下進入IAccountRepository構造,但這是下一次。

如您所見,我的存儲庫類都需要一個上下文實例。這就是我在同一個環境下工作,就像一個工作單位一樣。

我的問題是,我怎樣才能爲我的業務邏輯引入服務層?現在,我的存儲庫只有簡單的Get,Delete,All,Insert方法。我想爲我的特定業務邏輯和驗證提供服務層。什麼是最好的方式去做這件事?

乍一看,我可以製作服務類,就像我的回購類一樣,接受上下文並執行業務邏輯,然後使用回購類。這基本上隱藏了所有的知識庫。

這是一個很好的方法嗎?

回答

1

這是我使用的方法。這也可以讓你使你的存儲庫具有通用性。這裏有一個例子:

Internal class AccountService 
{ 
    Public Account GetAccount(string firstName) 
    { 
     var results = Enumerable.Empty<Account>(); 

     try 
     { 
      var repository = new Repository<Account>(); // I use and interface here and      
                 // then a factory class. I just 
                 // was trying to keep it simple. 
      results = repository.FindAll() 
       .Where(a => a.FirstName == firstName) 
       .ToList(); 
     } 
     catch()... etc. 

     return results; 
    } 
} 

Public interface IAccountService 
{ 
    Account GetAccount(string accountNumber); 
} 

通過使用這種模式它可以讓你嘲笑你的資料庫類的結果和單元測試你的服務類的方法,然後,因爲你正在使用的接口爲您服務類,你可以嘲笑你需要的服務方法的結果,如果你是單元測試你的UI級別...

另外我已經成功創建了LinqToSql和EntityFramework的通用存儲庫類,所以我可以更改框架,而應用程序的其餘部分不關心。