1

似乎存儲庫模式負責來自CRUD操作和數據訪問方法(例如:存儲過程),服務層正在利用存儲庫的方法來執行其工作。存儲庫模式和服務層

我的問題是,我能否將方法放入服務層,而不使用其存儲庫的方法?

例如,如果我的倉庫有這些方法,

public interface IRepository<T> 
{   
    void Add(T entity); 
    void Update(T entity); 
    void Delete(T entity); 
} 

和IStudentService類

public interface IStudentService 
{ 
    void AddNewStudent(Student student); 
    void UpdateStudent(Student student); 
    void DeleteStudent(Student student); 

    ExcelImportVM GetStudentExcelExport(List<Students> list); 
    List<SelectListItem> GetDateRange(); 
} 

和StudentService類實現:

public class StudentService : IStudentService 
    { 
     private IStudentRepository _repository;  

     public ShopLevelDashService(IStudentRepository repository) 
     { 
      _repository= repository;   
     } 

     public void AddNewStudent(Student student) 
     { 
      return _repository.Add(student); 
     } 

     // ..UpdateStudent & DeleteStudent methods 

     public List<SelectListItem> GetDateRange() 
     { 
      var dateRange = new List<ColumnValuesVM>() 
      { 
       new ColumnValuesVM { Id = 1, Value = "test" }, 
       new ColumnValuesVM { Id = 2, Value = "test2" } 
      }; 

      var selectList = new List<SelectListItem>(); 

      // ..foreach 

      return selectList; 
     } 

     ExcelImportVM GetStudentExcelExport(List<Students> list) 
     { 
      // ..codes 

      return viewModel; 
     } 
    } 

這是否有道理放方法如StudentExcelExport()GetDateRange()服務中不使用倉庫中的方法的類? (可能例如:_repository.GetDateRange()

或者將它們放在控制器中會更好嗎?

+1

服務應只返回業務數據。應該在控制器級別將業務數據轉換爲用於UI的視圖模型和其他可見類型。所以這個服務的方法應該只返回數據,並且在控制器中您應該從該數據創建selectitem列表。 –

回答

0

正如@Chetan指出的,服務層是您的數據訪問層(DAL)。因此,在您的服務中不會使用StudentExcelExport()GetDateRange()的最佳做法。服務層應該只有處理數據庫操作的方法。

由於您的兩種方法只是準備視圖組件,應該在控制器級別。對於其他複雜邏輯,您可以使用業務邏輯層而不是DAL混合。

還是把它們放在控制器中會更好?

答案是放在控制器中。

希望這會有所幫助!

+0

Hi Div,根據你的觀點,所有不涉及數據庫操作的方法都應該留在控制器中。你能詳細闡述一下你的複雜邏輯嗎? – pavilion

+0

是的!但*不完全取決於。例如,用戶使用令牌登錄,並且在您的最後,您需要解密該令牌以檢查用戶是否是有效用戶。現在解密邏輯是複雜的邏輯,它不處理數據庫權利?所以邏輯不應該去控制器,它應該在BL(業務邏輯),這就是我的意思是複雜的邏輯。 http://imgr.es/3OI3 –

+0

好的。所以基本上,如果我的GetDateRange()函數包含了在其foreach循環中獲取學生信息的數據庫操作,首先我需要將此函數放在控制器中並與該函數內部的業務邏輯(_studentService.GetStudent(student))混合? – pavilion