ASP.NET Web API存储库模式服务层(业务逻辑)

时间:2014-03-27 04:30:01

标签: json asp.net-mvc-4 repository-pattern business-logic

我刚刚完成了Repository Pattern& amp;使用Ninject依赖注入到我的asp.net web api项目中的工作单元。

我使用Entity Framework作为我的ORM。

我有以下解决方案结构(项目):

  • Web应用程序(asp.net web api)
  • 数据(DBContext,存储库)
  • 接口(IRepository等)
  • 模型(来自DB的POCO类)

例如我的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);
            }

            }

所以我的问题是,在我的存储库方法中实现所有业务逻辑是否正确?以及在需要时返回消息或验证的最佳方法是什么。

感谢并感谢任何帮助!

2 个答案:

答案 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层架构的更多信息,并确保您已了解其概念及其目的。