2017-07-27 34 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); 
     } 
    } 
}