Asp.net mvc 存储库模式和服务层

Asp.net mvc 存储库模式和服务层,asp.net-mvc,repository-pattern,n-tier-architecture,service-layer,Asp.net Mvc,Repository Pattern,N Tier Architecture,Service Layer,似乎存储库模式由CRUD操作和数据访问方法(例如:存储过程)负责,而服务层正在利用存储库的方法来执行其工作 我的问题是,我能否将不使用其存储库方法的方法放在服务层中 例如,如果我的存储库有这些方法 public interface IRepository<T> { void Add(T entity); void Update(T entity); void Delete(T entity); } 公共接口IRepository {

似乎存储库模式由CRUD操作和数据访问方法(例如:存储过程)负责,而服务层正在利用存储库的方法来执行其工作

我的问题是,我能否将不使用其存储库方法的方法放在服务层中

例如,如果我的存储库有这些方法

public interface IRepository<T>
{        
    void Add(T entity);
    void Update(T entity);
    void Delete(T entity);
}
公共接口IRepository
{        
无效添加(T实体);
无效更新(T实体);
无效删除(T实体);
}
在学生服务课上

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

    ExcelImportVM GetStudentExcelExport(List<Students> list);
    List<SelectListItem> GetDateRange();
}
公共接口IStudentService
{
void AddNewStudent(学生);
无效更新学生(学生);
无效的学生(学生);
ExcelImportVM GetStudentExcelExport(列表);
列出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;
       }
    }
公共班级学生服务:IStudentService
{
私有IStudentRepository(存储库);
public ShopLevelDashService(IStudentRepository存储库)
{
_存储库=存储库;
}
公共无效添加新闻学生(学生)
{
返回_repository.Add(学生);
}
//…更新学生和删除学生方法
公共列表GetDateRange()
{
var dateRange=新列表()
{
新ColumnValuesVM{Id=1,Value=“test”},
新ColumnValuesVM{Id=2,Value=“test2”}
};
var selectList=新列表();
//…foreach
返回选择列表;
}
ExcelImportVM GetStudentExcelExport(列表)
{
//..代码
返回视图模型;
}
}
StudentExcelExport()
GetDateRange()
这样的方法放在不使用存储库中方法的服务类中有意义吗?(可能例如:
\u repository.GetDateRange()


还是将它们放在控制器中更好?

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

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

还是把它们放在控制器里更好

答案是把它们放在控制器里


希望这有帮助

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

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

还是把它们放在控制器里更好

答案是把它们放在控制器里


希望这有帮助

服务应该只返回业务数据。应在控制器级别将业务数据转换为viewmodels和UI的其他可视类型。因此,该服务的方法应该只返回数据,并且在控制器中,您应该从该数据创建selectitem列表。该服务应该只返回业务数据。应在控制器级别将业务数据转换为viewmodels和UI的其他可视类型。因此,此服务的方法应该只返回数据,并且在控制器中,您应该从该数据创建selectitem列表。Hi Div,因此根据您的观点,所有不处理数据库操作的方法都应该保留在控制器中。你能详细阐述一下你复杂的逻辑吗?是的!但这并不完全取决于具体情况。例如,用户使用令牌登录,在您的终端,您需要解密该令牌以检查用户是否为有效用户。现在解密逻辑是复杂的逻辑,它不处理数据库,对吗?所以逻辑不应该进入控制器,它应该在BL(业务逻辑)中,这就是我所说的复杂逻辑。可以因此,基本上,如果我的GetDateRange()函数包含在其foreach循环中获取学生信息的数据库操作,首先我需要将此函数放入控制器中,并与该函数内部的业务逻辑(_studentService.GetStudent(student))混合使用?是的,完全正确!请记住,分离所有内容背后的逻辑是松散耦合的。我不会说“服务层是您的数据访问层(DAL)”,它们是独立的层(如果@chetan确实说它看起来像是在注释编辑之前)。但是我同意OP询问的两个方法不应该放在服务类中,因为它们返回的是基于表示的对象。Hi Div,根据您的观点,所有不处理数据库操作的方法都应该放在controller中。你能详细阐述一下你复杂的逻辑吗?是的!但这并不完全取决于具体情况。例如,用户使用令牌登录,在您的终端,您需要解密该令牌以检查用户是否为有效用户。现在解密逻辑是复杂的逻辑,它不处理数据库,对吗?所以逻辑不应该进入控制器,它应该在BL(业务逻辑)中,这就是我所说的复杂逻辑。可以因此,基本上,如果我的GetDateRange()函数包含在其foreach循环中获取学生信息的数据库操作,首先我需要将此函数放入控制器中,并与该函数内部的业务逻辑(_studentService.GetStudent(student))混合使用?是的,完全正确!请记住,分离所有内容背后的逻辑是松散耦合的。我不会说“服务层是您的数据访问层(DAL)”,它们是独立的层(如果@chetan确实说它看起来像是之前的)