Asp.net mvc 存储库模式和服务层
似乎存储库模式由CRUD操作和数据访问方法(例如:存储过程)负责,而服务层正在利用存储库的方法来执行其工作 我的问题是,我能否将不使用其存储库方法的方法放在服务层中 例如,如果我的存储库有这些方法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 {
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确实说它看起来像是之前的)