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.
analogo: http://stackoverflow.com/q/6889245/ –