2017-07-27 31 views
0

我创造了这个GenericController所有CRUD逻辑移动到GenericController,我砍死了一些东西,使其工作,如:从我的odata通用基础控制器中删除黑客?

  1. 创建TableForT设置实体
  2. 创建界面IndexedModel持有的GUID,以Compraion
  3. 硬编码DB背景

我怎样才能从我的代码删除这些黑客,以保持我的代码清洁?

namespace AirVinyl.API.Controllers 
{ 
    public class GenericController<T> : ODataController where T : class, IndexedModel 
    { 
     AirVinylDbContext db = new AirVinylDbContext(); 

     private bool Exists(long key) 
     { 
      return TableForT().Any(p => p.Id.Equals(key)); 
     } 

     private DbSet<T> TableForT() 
     { 
      return db.Set<T>(); 
     } 

     protected override void Dispose(bool disposing) 
     { 
      db.Dispose(); 
      base.Dispose(disposing); 
     } 

     [EnableQuery] // EnableQuery allows filter, sort, page, top, etc. 
     public IQueryable<T> Get() 
     { 
      return TableForT(); 
     } 


     [EnableQuery] 
     public SingleResult<T> Get([FromODataUri] long key) 
     { 
      IQueryable<T> result = Get().Where(p => p.Id.Equals(key)); 
      return SingleResult.Create(result); 
     } 


     public async Task<IHttpActionResult> Post(T obj) 
     { 
      if (!ModelState.IsValid) 
      { 
       return BadRequest(ModelState); 
      } 

      TableForT().Add(obj); 
      await db.SaveChangesAsync(); 
      return Created(obj); 
     } 


     public async Task<IHttpActionResult> Patch([FromODataUri] long key, Delta<T> delta) 
     { 
      if (!ModelState.IsValid) 
      { 
       return BadRequest(ModelState); 
      } 

      var entity = await TableForT().FindAsync(key); 
      if (entity == null) 
      { 
       return NotFound(); 
      } 

      delta.Patch(entity); 

      try 
      { 
       await db.SaveChangesAsync(); 
      } 
      catch (DbUpdateConcurrencyException) 
      { 
       if (!Exists(key)) 
       { 
        return NotFound(); 
       } 
       else 
       { 
        throw; 
       } 
      } 

      return Updated(entity); 
     } 


     public async Task<IHttpActionResult> Put([FromODataUri] long key, T obj) 
     { 
      if (!ModelState.IsValid) 
      { 
       return BadRequest(ModelState); 
      } 

      if (key.Equals(obj.Id) == false) 
      { 
       return BadRequest(); 
      } 

      db.Entry(obj).State = EntityState.Modified; 

      try 
      { 
       await db.SaveChangesAsync(); 
      } 
      catch (DbUpdateConcurrencyException) 
      { 
       if (!Exists(key)) 
       { 
        return NotFound(); 
       } 
       else 
       { 
        throw; 
       } 
      } 

      return Updated(obj); 
     } 

     public async Task<IHttpActionResult> Delete([FromODataUri] long key) 
     { 
      var entity = await TableForT().FindAsync(key); 
      if (entity == null) 
      { 
       return NotFound(); 
      } 

      TableForT().Remove(entity); 
      await db.SaveChangesAsync(); 
      return StatusCode(HttpStatusCode.NoContent); 
     } 
    } 
} 

回答

0
经过长期的研究后

和阅读

public class GenericController<T> : ODataController where T : class, IndexedModel 
    { 

     private readonly AirVinylDbContext db; 
     private readonly DbSet<T> set; 

     public GenericController() 
     { 
      this.db = new AirVinylDbContext(); 
      this.set = this.db.Set<T>(); 
     } 
     private bool Exists(Guid key) 
     { 
      return this.set.Any(p => p.Id.Equals(key)); 
     } 



     protected override void Dispose(bool disposing) 
     { 
      db.Dispose(); 
      base.Dispose(disposing); 
     } 

     [EnableQuery] // EnableQuery allows filter, sort, page, top, etc. 
     public IQueryable<T> Get() 
     { 
      return this.set.AsQueryable(); 
     } 


     [EnableQuery] 
     public SingleResult<T> Get([FromODataUri] Guid key) 
     { 
      IQueryable<T> result = Get().Where(p => p.Id.Equals(key)); 
      return SingleResult.Create(result); 
     } 


     public async Task<IHttpActionResult> Post(T obj) 
     { 
      if (!ModelState.IsValid) 
      { 
       return BadRequest(ModelState); 
      } 

      this.set.Add(obj); 
      await db.SaveChangesAsync(); 
      return Created(obj); 
     } 


     public async Task<IHttpActionResult> Patch([FromODataUri] Guid key, Delta<T> delta) 
     { 
      if (!ModelState.IsValid) 
      { 
       return BadRequest(ModelState); 
      } 

      var entity = await this.set.FindAsync(key); 
      if (entity == null) 
      { 
       return NotFound(); 
      } 

      delta.Patch(entity); 

      try 
      { 
       await db.SaveChangesAsync(); 
      } 
      catch (DbUpdateConcurrencyException) 
      { 
       if (!Exists(key)) 
       { 
        return NotFound(); 
       } 
       else 
       { 
        throw; 
       } 
      } 

      return Updated(entity); 
     } 


     public async Task<IHttpActionResult> Put([FromODataUri] Guid key, T obj) 
     { 
      if (!ModelState.IsValid) 
      { 
       return BadRequest(ModelState); 
      } 

      if (key.Equals(obj.Id) == false) 
      { 
       return BadRequest(); 
      } 

      db.Entry(obj).State = EntityState.Modified; 

      try 
      { 
       await db.SaveChangesAsync(); 
      } 
      catch (DbUpdateConcurrencyException) 
      { 
       if (!Exists(key)) 
       { 
        return NotFound(); 
       } 
       else 
       { 
        throw; 
       } 
      } 

      return Updated(obj); 
     } 

     public async Task<IHttpActionResult> Delete([FromODataUri] Guid key) 
     { 
      var entity = await this.set.FindAsync(key); 
      if (entity == null) 
      { 
       return NotFound(); 
      } 

      this.set.Remove(entity); 
      await db.SaveChangesAsync(); 
      return StatusCode(HttpStatusCode.NoContent); 
     } 
    } 
}