我刚刚完成了Repository Pattern& amp;使用Ninject依赖注入到我的asp.net web api项目中的工作单元。
我使用Entity Framework作为我的ORM。
我有以下解决方案结构(项目):
例如我的PersonRepository(数据项目):
public class PersonsRepository : EFRepository<Person>, IPersonsRepository
{
public PersonsRepository(DbContext context) : base(context) { }
public IQueryable<Person> GetByAge(int age)
{
return DbSet.FirstOrDefault(ps => ps.age == age);
}
public void Delete(int personId, int age)
{
// Here I want to validate some stuff before deleting
// Business Rules need to be here!!
var attendance = new Attendance {PersonId = personId, Age = age};
Delete(attendance);
}
}
所以我的问题是,在我的存储库方法中实现所有业务逻辑是否正确?以及在需要时返回消息或验证的最佳方法是什么。
感谢并感谢任何帮助!
答案 0 :(得分:2)
Data和Web之间应该有一个名为Business的新层。 Web将仅引用业务层,而业务层仅引用数据层。因此,调用数据层之前或之后的业务层可以实现其所有验证和业务逻辑。
答案 1 :(得分:1)
不,不是。存储库实现属于持久性(DAL)。存储库关注的是转换&#39;业务对象与/或从用于将它们存储到数据库中的任何形式。关心业务逻辑并不是它的责任。业务逻辑保留在域中的业务层中。
业务逻辑由域对象和服务包含。它永远不会出现在业务层之外,不会出现在DAL(存储库,EF等)中的UI(控制器)之外。
您正在使用的存储库实现是错误的,反模式,因为它违背了存储库的目的:将业务层与持久性详细信息分离(EF是实现细节)。存储库的接口永远不应该暴露像IQueryable或EF实体这样的细节。它应该知道&#39;仅涉及业务对象。
您的解决方案结构对我来说毫无意义:您使用的所有接口都应该位于它们所属的层中(存储库接口是业务层的一部分,这就是它不应该知道的原因)关于EF)。基于您的描述,模型似乎是持久性模型(它应该是数据的一部分)。
您需要一个商业(域)层,其中模型真正意味着商业模式。不要与持久性模型(由EF使用),视图模型(由View使用)或MV从MVC(由控制器使用):)混淆。 MVC中的M指的是商业模式的一部分,但它与商业模式不同。
我建议您花点时间阅读有关存储库模式和3层架构的更多信息,并确保您已了解其概念及其目的。