2016-03-26 17 views
0

以下のコントローラがあります。両方のコントローラのすべてのメソッドは同じです。私は汎用ベースコントローラを作成し、この汎用ベースコントローラから両方のコントローラを継承したいと考えています。誰でも助けてくれますか?ウェブAPIの汎用ベースコントローラ

コースコントローラ

public class CoursesController : ApiController 
    { 




     CourseRepository repository = new CourseRepository(); 
     public List<Courseinfo> GetAllCourses() 
     { 
      var courses = repository.SelectAll(); 
      var c = AutoMapper.Mapper.Map<List<Courseinfo>>(courses); 
      return c; 

     } 
     [ResponseType(typeof(Course))] 
     public IHttpActionResult GetCourseById(int id) 
     { 
      var courses = repository.SelectByID(id); 
      if (courses == null) 
      { 
       return NotFound(); 
      } 
      var Courseifno = AutoMapper.Mapper.Map<Courseinfo>(courses); 
      return Ok(Courseifno); 
     } 

     // PUT: api/Courses/5 
     [ResponseType(typeof(void))] 
     public IHttpActionResult PutCourse(int id, Courseinfo courses) 
     { 
      if (!ModelState.IsValid) 
      { 
       return BadRequest(ModelState); 
      } 
      if (id != courses.CourseId) 
      { 
       return BadRequest(); 
      } 
      //Student s = new Student(); 
      var s = AutoMapper.Mapper.Map<Course>(courses); 
      repository.Update(s); 
      repository.Save(); 
      return StatusCode(HttpStatusCode.NoContent); 

     } 

     //POST: api/Courses 
     [ResponseType(typeof(Course))] 
     public IHttpActionResult PostCourse(Courseinfo course) 
     { 
      if (!ModelState.IsValid) 
      { 
       return BadRequest(ModelState); 
      } 


      var Courses = AutoMapper.Mapper.Map<Course>(course); 
      repository.Insert(Courses); 

      repository.Save(); 

      return CreatedAtRoute("DefaultApi", new { id = course.CourseId }, course); 
     } 

     // DELETE: api/Courses/5 
     [ResponseType(typeof(Course))] 
     public IHttpActionResult DeleteCourse(int id) 
     { 

      Course Courses = new Course(); 

      var cour = repository.SelectByID(id); 
      if (cour == null) 
      { 
       return NotFound(); 
      } 
      repository.Delete(id); 
      repository.Save(); 

      return Ok(Courses); 
     } 

学生コントローラ

public class StudentsController : ApiController 
    { 




     MystudentRepository repository = new MystudentRepository(); 
     public IEnumerable<Studentinfo> GetStudents() 
     { 
      var student = repository.SelectAll(); 
      var studentinfo = AutoMapper.Mapper.Map<List<Studentinfo>>(student); 
      return studentinfo; 

     } 

     [ResponseType(typeof(Student))] 

     public IHttpActionResult GetStudents(int id) 
     { 

      var student = repository.SelectByID(id); 
      if (student == null) 
      { 

       // return NotFound(); 
       string message = "No student exist"; 

       throw new HttpResponseException(

        Request.CreateErrorResponse(HttpStatusCode.NotFound, message)); 

      } 
      var studentifno = AutoMapper.Mapper.Map<Studentinfo>(student); 

      return Ok(studentifno); 
     } 
     [ResponseType(typeof(Student))] 
     public IHttpActionResult PutStudent(int id, Studentinfo students) 
     { 

      if (!ModelState.IsValid) 
      { 

       return BadRequest(ModelState); 
      } 
      if (id != students.StudentId) 
      { 
       return BadRequest(); 
      } 
      //Student s = new Student(); 
      var s = AutoMapper.Mapper.Map<Student>(students); 
      repository.Update(s); 
      repository.Save(); 
      return StatusCode(HttpStatusCode.NoContent); 

     } 


     [ResponseType(typeof(Student))] 
     public IHttpActionResult PostStudent(Studentinfo student) 
     { 
      if (!ModelState.IsValid) 
      { 
       return BadRequest(ModelState); 
      } 


      var students = AutoMapper.Mapper.Map<Student>(student); 
      repository.Insert(students); 

      repository.Save(); 

      return CreatedAtRoute("DefaultApi", new { id = student.StudentId }, student); 
     } 

     [ResponseType(typeof(Student))] 
     public IHttpActionResult DeleteStudent(int id) 
     { 

      Student student = new Student(); 

      var Std = repository.SelectByID(id); 
      if (Std == null) 
      { 
       return NotFound(); 
      } 
      repository.Delete(id); 
      repository.Save(); 

      return Ok(student); 
     } 
  1. 方法 ため、各コントローラを継承する方法を、これらの 2 contrllersの汎用ベースコントローラを作るとすることを私を助けてください汎用ベースコントローラ。

答えて

0

Web APIの属性ルーティングがRoute属性の継承をサポートしていないため、汎用ベースコントローラを作成できません。

回避策として、コントローラーロジックを別の汎用クラスに移動し、コントローラーにインスタンスを追加し、コントローラーメソッド内で汎用クラスメソッドを呼び出すことができます。例えば

public class RepositoryHandler<T> // generic base class that will incapsulate all "controllers generic logic" 
{ 
    private IRepository _repository; 

    public RepositoryHandler (IRepository repository) 
    { 
     _repository = repository; 
    } 

    public IEnumerable<T> GetAll() 
    { 
     var data = repository.SelectAll(); 
     return AutoMapper.Mapper.Map<List<T>>(data); 
    } 
}  

public class CoursesController : ApiController 
{ 
    private RepositoryHandler<Courseinfo> _courseHandler; 

    public CoursesController() 
    { 
     IRepository repository = new CourseRepository(); 
     _courseHandler = new RepositoryHandler<Courseinfo>(repository); 
    } 

    public List<Courseinfo> GetAllCourses() 
    { 
     var courseInfo = _courseHandler.GetAll(); 
     return courseInfo.ToList(); 

    } 
} 

public class StudentsController : ApiController 
{ 
    private RepositoryHandler<Studentinfo> _studentHandler; 

    public StudentsController() 
    { 
     IRepository repository = new MyStudentRepository(); 
     _studentHandler = new RepositoryHandler<Studentinfo>(repository); 
    } 

    public List<Studentinfo> GetAllStudents() 
    { 
     var studentinfo = _studentHandler.GetAll(); 
     return studentinfo.ToList(); 
    } 
} 
+0

しかし、どのように行うには、私を助けてくださいことができますか? – khan

+0

しかし、私はIGenericRepositoryから継承したGenericRepositryを持っています。 – khan

+0

確かに、あなたのクラス/インターフェースを使うべきです。 IIRepositoryはちょうど例の名前だった – Set

関連する問題