Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json ASP.NET Web API存储库模式服务层(业务逻辑)_Json_Asp.net Mvc 4_Repository Pattern_Business Logic - Fatal编程技术网

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

Json ASP.NET Web API存储库模式服务层(业务逻辑),json,asp.net-mvc-4,repository-pattern,business-logic,Json,Asp.net Mvc 4,Repository Pattern,Business Logic,我刚刚使用Ninject依赖项注入到我的asp.NETWebAPI项目中,实现了存储库模式和工作单元 我使用实体框架作为我的ORM 我有以下解决方案结构(项目): Web应用程序(asp.net Web api) 数据(数据库上下文、存储库) 接口(IRepository等) 模型(数据库中的POCO类) 例如,MyPersonRepository(数据项目): 公共类PersonRepository:eRepository,IPersonRepository { publicpersons

我刚刚使用Ninject依赖项注入到我的asp.NETWebAPI项目中,实现了存储库模式和工作单元

我使用实体框架作为我的ORM

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

  • Web应用程序(asp.net Web api)
  • 数据(数据库上下文、存储库)
  • 接口(IRepository等)
  • 模型(数据库中的POCO类)
例如,MyPersonRepository(数据项目):

公共类PersonRepository:eRepository,IPersonRepository
{
publicpersonsrepository(DbContext-context):基(context){}
公共IQueryable GetByAge(int age)
{
返回DbSet.FirstOrDefault(ps=>ps.age==age);
}
公共无效删除(int personId,int age)
{
//在这里,我想在删除之前验证一些内容
//业务规则需要在这里!!
var考勤=新考勤{PersonId=PersonId,Age=Age};
删除(出席);
}
}
所以我的问题是,在我的存储库方法中实现所有业务逻辑是否正确?还有,如果需要,返回消息或验证的最佳方式是什么


谢谢并感谢您的帮助

不,不是。存储库实现属于持久性(DAL)。存储库涉及将业务对象“转换”为/从用于将其存储到数据库中的任何形式。关注业务逻辑不是它的责任。业务逻辑停留在业务层中,在域中

业务逻辑包含在域对象和服务中。它永远不会超出业务层,不会出现在UI(控制器)中,也不会出现在DAL(存储库、EF等)中

您使用的存储库实现是不正确的,是一种反模式,因为它违背了存储库的目的:将业务层与持久性细节分离(EF是一种实现细节)。存储库的接口不应公开IQueryable或EF实体等详细信息。它应该只“知道”业务对象

您的解决方案结构对我来说没有什么意义:您使用的所有接口都应该在它们所属的层中(存储库接口是业务层的一部分,这就是为什么它不应该知道EF)。根据您的描述,该模型似乎是持久性模型(它应该是数据的一部分)

您需要一个业务(域)层,其中模型实际上意味着业务模型。不要与持久性模型(EF使用)、视图模型(视图使用)或MVC中的M(控制器使用)混淆:)。MVC中的M指的是业务模型的一部分,但与业务模型不同


我建议您花点时间多读一些关于存储库模式和三层体系结构的知识,并确保您已经理解了这些概念及其用途

在数据和Web之间应该有一个称为业务的新层。Web将仅引用业务层,而业务层将仅引用数据层。因此,调用数据层之前或之后的业务层可以实现其所有验证和业务逻辑

实际上,我引用了John Papa Code Camper项目:在我的示例代码中,该存储库模式是自定义存储库的自定义实现。。。因为GetByAge方法只会由PersonRepo使用,所以您告诉我的是业务规则或逻辑(用于检查某个字段是否正确,条件是否为真,或者模型项目中应该包含什么内容(我在那里有我的POCO类)?业务逻辑应留在业务逻辑层,而不是数据层acccess@MikeSW-我正在学习存储库和MVC。你能给我指一个好的参考/教程吗?谢谢。马克
    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);
            }

            }