2011-09-05 15 views
10

Ho qualche metodo factoryCome fare in modo che i Contratti di codice ritengano che la variabile non sia nulla?

public T Create<T>() where T : class 
    { 
     Contract.Ensures(Contract.Result<T>() != null); 

     T result = this.unityContainer.Resolve<T>(); 

     return result; 
    } 

La cerco di costruire il progetto ottengo l'avvertimento:

CodeContracts: assicura non dimostrata: Contract.Result() = null

I Comprendere che l'interfaccia di IUnityContainer non ha contratti in modo che Code Contracts ritenga che varible possa essere nullo e non c'è modo di dimostrare che Create() restituirà risultati non nulli.

In che modo posso fare in modo che i Contratti di codice credano che la variabile non sia nulla?

primo luogo ho provato a chiamare Contract.Assert

public T Create<T>() where T : class 
    { 
     Contract.Ensures(Contract.Result<T>() != null); 

     T result = this.unityContainer.Resolve<T>(); 

     Contract.Assert(result != null); 

     return result; 
    } 

Ma mi ci vuole un altro avvertimento:

CodeContracts: affermare la non provata

ho provato make check per nulla e questo rende tutti avvisi andati:

public T Create<T>() where T : class 
    { 
     Contract.Ensures(Contract.Result<T>() != null); 

     T result = this.unityContainer.Resolve<T>(); 

     if (result == null) 
     { 
      throw new InvalidOperationException(); 
     } 

     return result; 
    } 

Ma non sono sicuro che questa sia una buona soluzione per generare eccezioni manualmente. Può esserci un modo per risolvere il problema utilizzando solo i Contratti di codice?

Grazie.

+0

analogo: http://stackoverflow.com/q/6889245/ –

risposta

16

ho che desideri Contract.Assume:

Contract.Assume(result != null); 

Dalla documentazione:

incarica strumenti di analisi di codice per supporre che la condizione specificata è vera, anche se non può essere provata staticamente a essere sempre vero

Questo convaliderà ancora il risultato al momento dell'esecuzione se il rewriter è configurato correttamente.

-1

Come if((result ?? 0) == 0){}

per rendere questo più chiaro (leggibile) è possibile definire un metodo di estensione.

Modifica

@allentracks risposta è più precisa per la tua domanda

+0

Come la mia risposta a @allentracks rispondere, perché aggiungi un operatore a coalescenza nulla quando 'result' non può essere nullo. – Lukazoid

-1
public T Create<T>() where T : class, new() 
    { 
     // do what you like... 

     return result ?? new T(); 
    } 
+0

Questo però scompare se gli oggetti in questione non hanno costruttori predefiniti. E suppongo che questo sia il caso in quanto l'OP sta cercando di risolverlo da un contenitore IoC. –

+0

Sì.In realtà T potrebbe essere un'interfaccia quindi non c'è modo di applicare il vincolo new(). –

+0

Questo codice non ha senso quando si utilizza 'IUnityContainer.Resolve '. Non è mai possibile che 'result' sia nullo. – Lukazoid

Problemi correlati