2016-08-22 29 views
1

Also habe ich einen Provider erstellt, der alle meine Code behandelt. Ursprünglich sah wie folgt aus:C# WebApi-Provider IHttpActionResult in der Klassenbibliothek

public class AnswerProvider : ApiController 
{ 

    private readonly IUnitOfWork _unitOfWork; 
    private readonly AnswerService _answerService; 

    private QuestionService _questionService; 
    public QuestionService QuestionService => _questionService ?? (_questionService = new QuestionService(this._unitOfWork)); 

    public AnswerProvider(IUnitOfWork unitOfWork) 
    { 
     this._unitOfWork = unitOfWork; 
     this._answerService = new AnswerService(unitOfWork); 
    } 

    public async Task<IHttpActionResult> CreateAsync(AnswerRequestModel model) 
    { 
     try 
     { 

      // Validate our answer count 
      await ValidateAnswerCountAsync(model.QuestionId); 

      // Create our model 
      var answer = ModelFactory.Create(model); 

      // Add our images to our answer 
      answer.Images = model.Images; 

      // Save our model 
      this._answerService.Create(answer); 

      // Save the database changes 
      await this._unitOfWork.SaveChangesAsync(); 

      // Return our updated model 
      return Ok(ModelFactory.Create(answer)); 

      // If there is an error 
     } 
     catch (Exception ex) 
     { 

      // Return our error 
      return BadRequest(ex.Message.ToString()); 
     } 
    } 

    /// <summary> 
    /// Validates the answers based on the question type 
    /// </summary> 
    /// <param name="id">The id of the question</param> 
    /// <returns></returns> 
    private async Task ValidateAnswerCountAsync(int id) 
    { 

     // Get our question 
     var question = await this.QuestionService.GetAsync(id, "Answers"); 

     // If we have 3 answers or more 
     if (question.Answers.Count >= 3 && question.Type == QuestionType.Boolean) 
     { 

      // Throw an error 
      throw new InvalidOperationException("A Boolean question can only have 3 answers"); 
     } 
    } 
} 

ich geerbt ApiController, weil ich Zugang zu den Ok gewinnen wollen, BadRequest und andere Methoden, das ist der einzige Grund. Wenn ich versuche, diesen Code auszuführen, obwohl es kompiliert ich diesen Fehler:

HttpControllerContext.Configuration must not be null

Ich gehe davon aus, dass liegt daran, dass ich die ApiController zu erben versuche und ich hätte das nicht tun. Gibt es einen anderen Weg, ich kann auf die Ok und andere ähnliche Methoden zugreifen, ohne die ApiController erben. Bitte beachten Sie, dass ich mehr als einen Anbieter haben werde.

+0

Erben Sie nicht von ApiController, sondern nur diese Methoden zu Ihrer neuen Klasse hinzufügen, da sie nicht so viel Code in sich sind. Sie können den Quellcode über Visual Studio oder Dotpeek (kostenlos) oder online abrufen. – Igor

+0

Ich schaue mir den Code an und es scheint nicht wirklich so einfach zu sein. Es scheint hier und überall viele kleine Codes zu geben. – r3plica

+0

Alternativ können Sie eine HttpStatusCode-Instanz zurückgeben und den ApiController damit umbrechen lassen, wenn der Wert 200 (Erfolg/Ok) in einer 'StatusCodeResult'-Instanz nicht übereinstimmt. – Igor

Antwort

0

Vererben Sie nicht von ApiController, da dies von einer Factory in der Anforderungs-Pipeline instanziiert wird. Sie sollten es nur für tatsächliche API-Controller-Instanzen erben, nicht für die Bequemlichkeit einiger der vorhandenen Methoden. Die beste Lösung wäre, benutzerdefinierte Exceptions in Ihrem Provider/Service/was auch immer zu werfen und sie in Ihrem Controller abzufangen und den korrekten HttpStatus zurückzugeben ODER die Exception durchzulassen und es würde zu einem 500-Status führen.

Wie gewünscht, obwohl ich einen kleinen Wrapper um den ApiController erstellt haben, den Sie in Ihrem Provider/Service/etc basierend auf einer Schnittstelle wiederverwenden konnten (so ist es leicht, dies zu abstrahieren UND einfach zu testen).

Verwandte Themen