有两个文件:一个给出界面如下:
IStudentInterface.cs
public interface IStudentService
{
IEnumerable<Student> GetStudents();
Student GetStudentById(int id);
void CreateStudent(Student student);
void UpdateStudent(Student student);
void DeleteStudent(int id);
void SaveStudent();
}
StudentService.cs:
public class StudentService : IStudentService
{
private readonly IStudentRepository _studentRepository;
private readonly IUnitOfWork _unitOfWork;
public StudentService(IStudentRepository studentRepository, IUnitOfWork unitOfWork)
{
this._studentRepository = studentRepository;
this._unitOfWork = unitOfWork;
}
#region IStudentService Members
public IEnumerable<Student> GetStudents()
{
var students = _studentRepository.GetAll();
return students;
}
public Student GetStudentById(int id)
{
var student = _studentRepository.GetById(id);
return student;
}
public void CreateStudent(Student student)
{
_studentRepository.Add(student);
_unitOfWork.Commit();
}
public void DeleteStudent(int id)
{
var student = _studentRepository.GetById(id);
_studentRepository.Delete(student);
_unitOfWork.Commit();
}
public void UpdateStudent(Student student)
{
_studentRepository.Update(student);
_unitOfWork.Commit();
}
public void SaveStudent()
{
_unitOfWork.Commit();
}
#endregion
}
请解释一下为什么创建私有_studentRepository
变量?我们也可以完成我们的任务而不是它。为什么所有这些都是这样做的?请解释一下这个概念?
答案 0 :(得分:2)
IStudentRepository
是StudentService
对象依赖于执行其工作的一组功能(合同,抽象,服务 - 可以通过各种术语)。 StudentService
还取决于IUnitOfWork
来执行其工作。
private readonly IStudentRepository _studentRepository;
是一个变量声明,用于存储实现合同的对象实例。它是私有的,因为它只需要在StudentService
类中访问它并且它是只读的,因为它是在类的构造函数中设置的,并且不需要在任何`StudentService'实例的生命周期中进行修改
控制反转的概念是,StudentService
负责定位其依赖项的实现并实例化它们并管理它们的生命周期,StudentService
外部的一些其他代码负责这些责任。这是可取的,因为它减少了StudentService
类的顾虑。
为了使控制反转更容易,通常使用容器。容器提供了一种说明哪些实现应该用于接口或契约的方法,还提供了一种自动提供这些实现的机制。最常见的方法是通过构造函数注入。 IoC容器将创建StudentService
类,它还将创建构造它所需的依赖项。在构造函数中,您将依赖项对象存储在类级变量中,以便在调用方法时可以使用它们来执行工作。
答案 1 :(得分:0)
我认为qes的答案非常明确!
IStudentService是一个接口,它不包含具体的方法,只是定义了必须具备和必须执行的实现。
类StudentService是实现,您已经知道需要创建,更新,删除和保存方法,因为它们位于界面中。所以你会在这堂课中找到这个具体的方法。
_studentRepository是一个字段,而不是属性,因此您不希望任何其他人触摸它,这就是它为私有的原因。但也是readonly,因为它需要在初始化StudentServices类时定义,并且需要保持与创建对象时一样。
我希望这个答案能够补充前一个答案。