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