0

有两个文件:一个给出接口如下:

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();
}

学生服务.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创建私有变量?我们也可以代替它来完成我们的任务。为什么所有这些事情都是这样完成的?请解释一下这个概念?

4

2 回答 2

3

IStudentRepositoryStudentService是对象执行其工作所依赖的一组功能(合同、抽象、服务 - 它可以用各种术语来表示) 。这StudentService也取决于IUnitOfWork执行其工作。

private readonly IStudentRepository _studentRepository;是一个变量声明,用于存储实现合同的对象的实例。它是私有的,因为它只需要在StudentService类中访问,它是只读的,因为它是在类的构造函数中设置的,并且不需要在任何“StudentService”实例的生命周期后期修改。

控制反转的概念是,不是StudentService负责定位其依赖项的实现并实例化它们并管理它们的生命周期,而是由外部的一些其他代码StudentService承担这些责任。这是可取的,因为它减少了StudentService类的关注。

为了更容易应用控制反转,经常使用容器。容器提供了一种方式来说明哪些实现应该用于接口或契约,并且还提供了一种自动提供这些实现的机制。最常见的方式是通过构造函数注入。IoC 容器将创建StudentService该类,并且还将创建构造它所需的依赖项。在构造函数中,您可以将依赖对象存储在类级变量中,以便在调用方法时使用它们来执行工作。

于 2012-11-28T20:58:53.277 回答
0

我觉得qes的答案很明确!

IStudentService 是一个接口,它不包含具体的方法,只是定义了实现必须具备和必须做的事情。

StudentService 类是实现,您已经知道需要有 Create、Update、Delete 和 Save 方法,因为它们在接口中。所以你会在这个类中找到这个具体的方法。

_studentRepository 是一个字段,而不是一个属性,因此您不希望其他人触摸它,这就是它是私有的原因。但也是只读的,因为它需要在初始化 StudentServices 类时定义,并且它需要保持与创建对象时一样。

我希望这个答案能补充上一个答案。

于 2012-11-28T21:19:52.387 回答