Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.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
Entity framework core 实体框架核心、工作单元和存储库模式_Entity Framework Core_Repository_Unit Of Work - Fatal编程技术网

Entity framework core 实体框架核心、工作单元和存储库模式

Entity framework core 实体框架核心、工作单元和存储库模式,entity-framework-core,repository,unit-of-work,Entity Framework Core,Repository,Unit Of Work,在阅读了大量文章指出不建议将UOW和存储库模式放在EF Core db上下文之上之后,我几乎同意并准备在我的一个新项目中实现注入IDBContext的服务 我说差不多,因为我以前使用过一个特性,我不知道在没有存储库的情况下如何实现 在以前的项目中,我在EF上使用了UOW和存储库模式,并从服务访问了它们。以下方法将位于存储库中,并且可以在此后通过从任何服务调用uow.StudentRepository.Get(id)来调用 public async Task<Student> Get(

在阅读了大量文章指出不建议将UOW和存储库模式放在EF Core db上下文之上之后,我几乎同意并准备在我的一个新项目中实现注入IDBContext的服务

我说差不多,因为我以前使用过一个特性,我不知道在没有存储库的情况下如何实现

在以前的项目中,我在EF上使用了UOW和存储库模式,并从服务访问了它们。以下方法将位于存储库中,并且可以在此后通过从任何服务调用
uow.StudentRepository.Get(id)
来调用

public async Task<Student> Get(Guid id)
    {
        return await _context.Students
            .Include(x => x.Course)
            .Include(x=>x.Address)
            .Include(x => x.Grade)
            .FirstOrDefaultAsync(x => x.Id == id);
    }
…每次我想做这个查询。这似乎是错误的,因为它不会干燥

问题


有人能建议一种方法,我可以在一个地方声明这个代码,而不需要存储库吗?

听起来你需要一个服务。您可以创建类似DbContext的服务,以便将其注入控制器

IStudentService.cs

公共接口IStudentService
{
任务:学生();
//这里的其他学生。。
}
StudentService.cs

公共班级学生服务:IStudentService
{
私有只读数据上下文_上下文;
公共学生服务(DataContext上下文)
{
_上下文=上下文;
}
公共异步任务GetStudents()
{
返回等待上下文
.包括(x=>x.课程)
.Include(x=>x.Address)
.包括(x=>x.Grade)
.ToListAsync();
}
}
然后将服务注册到
Startup.cs中的
ConfigureServices()

services.addScope();
现在,您可以将服务注入任何控制器。例如:

[ApiController]
[路由(“api/[控制器]”)]
公共班级学生控制员:ControllerBase
{
私人只读IStudentService(U studentService);
私有只读数据上下文_上下文;
公共学生服务(DataContext上下文,IStudentService学生服务)
{
_上下文=上下文;
_学生服务=学生服务;
}
[HttpGet]
公共虚拟异步任务列表()
{
返回Ok(等待_studentService.GetStudents());
}
}

请确保仅当您在多个控制器上使用该服务时才创建该服务,并避免陷入反模式。

感谢您回复Guillermo。我有一个后续问题-目前GetStudents()位于StudentsRespository中,可以从工作单元(uow.Students.GetStudents)访问。如果我需要从其他服务访问GetStudents,我可以轻松地从工作单元访问它。如果这被移动到StudentService,并且我想从另一个服务(比如AdminService)访问GetStudents,将StudentService注入AdminService是否可以接受?是的,您可以将StudentService注入到其他服务中,您可以在这里找到更多关于依赖项注入的信息:对于进一步的问题,我很抱歉,我对DI没有意见,但我不确定的是,这对架构师来说是否是一种合理的方式,因为我想避免“混乱”的服务构造函数,即
公共人员服务(ILogService logService、ICourseService courseService、IAddressService addressService)
,然后才能访问所有这些(作为存储库)我喜欢这个解决方案,因为您的学生服务本质上是一个隔离的DAO类。我过去是UOW存储库模式的粉丝,我认为这是一个很好的发展方向。上面建议的服务与存储库有何不同?这里的主要区别似乎只是名义上的。这可能只是一个糟糕的例子,但上面的内容看起来与我遇到的大多数存储库类完全相同。
服务
通常包含业务逻辑,但在上面,它更像是一个“传递”接口(这不一定是件好事)。
_context.Students
            .Include(x => x.Course)
            .Include(x=>x.Address)
            .Include(x => x.Grade)
            .FirstOrDefaultAsync(x => x.Id == id);