【问题标题】:Repository pattern and service layer存储库模式和服务层
【发布时间】:2017-09-19 01:33:25
【问题描述】:

似乎存储库模式负责 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()

或者将它们放在控制器中更好?

【问题讨论】:

  • 服务应该只返回业务数据。将业务数据转换为视图模型和 UI 的其他可视类型应该在控制器级别完成。所以这个服务的方法应该只返回数据,在控制器中你应该从该数据创建选择项列表。

标签: asp.net-mvc repository-pattern n-tier-architecture service-layer


【解决方案1】:

正如@Chetan 指出的那样,服务层是您的数据访问层(DAL)。因此,在您的服务中使用 StudentExcelExport()GetDateRange() 并不是最佳实践。服务层应该只有处理数据库操作的方法。

由于您的两种方法都只是准备视图组件,因此应该在控制器级别。对于其他复杂的逻辑,您可以使用业务逻辑层而不是与 DAL 混合。

或者将它们放在控制器中更好?

答案是将它们放入控制器中。

希望这会有所帮助!

【讨论】:

  • 嗨,Div,所以根据你的观点,所有不处理数据库操作的方法都应该留在控制器中。你能详细说明一下你的复杂逻辑吗?
  • 是的!但不完全是这取决于。例如,用户使用令牌登录,最后您需要解密该令牌以检查用户是否是有效用户。现在解密逻辑是复杂的逻辑,不处理数据库吧?所以逻辑不应该进入控制器,它应该在 BL(业务逻辑)中,这就是我所说的复杂逻辑。 imgr.es/3OI3
  • 好的。所以基本上如果我的 GetDateRange() 函数包含在其 foreach 循环中获取学生信息的数据库操作,首先我需要将此函数放入控制器中并与该函数内部的业务逻辑 (_studentService.GetStudent(student)) 混合?跨度>
  • 是的,完全正确!请记住,分离所有事物背后的逻辑是松散耦合。
  • 我不会说“服务层是您的数据访问层 (DAL)”,它们是独立的层(如果 @chetan 确实说它看起来像是在评论编辑之前)。但我同意 OP 询问的两种方法不应该进入服务类,因为它们返回基于表示的对象。
猜你喜欢
  • 2016-10-07
  • 1970-01-01
  • 2013-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-03
  • 2011-04-02
相关资源
最近更新 更多