2011-04-12 17 views
7

Nie mogę skonfigurować umów kodowych w mojej klasie. Podążyłem za dokumentacją i przykładem, ale to nie działa.konfigurowanie umów kodu w interfejsie

chciałbym wstawić Code Contracts warunek do mojego interfejsu, oto mój kod

Interfejs

[ContractClass(typeof(ArticleBLLContract))] 
public interface IArticleBLL 
{ 
    int getArticleNSheet(string IdBox); 
    IEnumerable<IArticle> getArticleValue(string IdBox, string IdLanguage); 
} 

Umowa Klasa

[ContractClassFor(typeof(IArticleBLL))] 
public sealed class ArticleBLLContract : IArticleBLL 
{ 
    int IArticleBLL.getArticleNSheet(string IdBox) 
    { 
     Contract.Requires<ArgumentOutOfRangeException>(!String.IsNullOrEmpty(IdBox),"IdBox has no valid value");       

     return default(int); 
    } 

    IEnumerable<Base.Article.IArticle> IArticleBLL.getArticleValue(string IdBox, string IdLanguage) 
    { 
     Contract.Requires<ArgumentOutOfRangeException>(!String.IsNullOrEmpty(IdBox), "IdBox has no valid value"); 
     Contract.Requires<ArgumentOutOfRangeException>(!String.IsNullOrEmpty(IdLanguage), "IdLanguagehas no valid value"); 

     Contract.Ensures(Contract.Result<IEnumerable<Base.Article.IArticle>>() != null, "Return value is out of Range"); 

     return default(IEnumerable<Base.Article.IArticle>); 
    }   
} 

Klasa zastosować kontraktu

public class ArticleBLL : IArticleBLL 
{ 

    public int getArticlNSheet(string IdBox) 
    { 
     try 
     { 
      return _Dal... 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
    } 

    public IEnumerable<IArticle> getArticleValue(string IdBox, string IdLanguage) 
    { 
     IEnumerable<IArticle> article = null; 

     try 
     { 
      article = _Dal... 

      return article; 

     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
    } 
} 

Próbowałem wstawić przerwania w tym wierszu

Contract.Requires<ArgumentOutOfRangeException>(!String.IsNullOrEmpty(IdBox),"IdBox has no valid value"); 

ale kiedy wywołać metodę nigdy nie przechodzi tutaj To jest moja konfiguracja projekt Code Contracts Config

Czy coś się stało?

Dziękujemy!

Odpowiedz

3

Całkowita re-write, na podstawie uwag do tej pory

I utworzeniu projektu biblioteki klasy i umieścić interfejs i klasę zamówieniu tam. Ustawiłem go na "Standardowy wymóg umowy", sprawdzanie wstępne i końcowe w czasie pracy i budowanie referencyjnego zestawu kontraktów (ustawiłem identyczne opcje debugowania i wydania).

Mam już aplikację konsolową z klasą implementującą interfejs i ustawioną opcję "Standardowa umowa wymaga", sprawdzanie wstępne i pocztowe w czasie wykonywania (ponownie ustawić identycznie między debugowaniem i wydaniem).

Uruchamiając go w trybie debugowania lub zwolnienia, otrzymuję numer ArgumentOutOfRangeException podczas próby wywołania getArticleNSheet.

Z oczywistym wyjątkiem przejścia na "Kontrakt standardowy wymagany", co powyżej nie pasuje do bieżącej konfiguracji?


I w rzeczywistości wcześniej popełniłem błąd. Z "Standardową umową wymaga", jestem faktycznie w stanie trafić punkt przerwania w klasie umowy, podczas debugowania. Nie jestem pewien, w jaki sposób Wizardry jest w stanie to zrobić - ponieważ nie działa dosłownie w tej klasie kodu - o czym świadczy fakt, że można ponownie napisać metodę w klasie kontraktu jako:

int IArticleBLL.getArticleNSheet(string IdBox) 
    { 
     Contract.Requires<ArgumentOutOfRangeException>(!String.IsNullOrEmpty(IdBox), "IdBox has no valid value"); 

     throw new NotImplementedException(); 
    } 

Możesz umieścić punkt przerwania na linii Contract.Requires i wydaje się, że trafił (po ostrzeżeniu o niezgodności plików, prawdopodobnie z powodu ponownego nagrania). Ale zakładając, że przekazałeś niepustny ciąg, nie rzuca on wtedy NotImplementedException.

+0

Próbowałem przekazać String.Empty w metodzie getArticleNSheet, ale wszelkie wyjątki zostały podniesione. Próbuję również zmienić na jawne implementacje interfejsu, ale nie podniosłem żadnych wyjątków. Czy coś jest nie tak w konfiguracji? Dziękuję – Faber

+0

@Faber - Zakładając, że wszystko to jest w jednym zestawie, stwierdzam również, że umowa nie wydaje się być sprawdzona. Jeśli zmienię konfigurację Assembly Reference Assembly na "Build", zamiast "None", otrzymam ostrzeżenia, że ​​muszę wdrożyć niestandardową walidację argumentów, lub jak powiedział Roy, przełącz na "Standard Contract Required" –

+0

Próbowałem zmodyfikuj konfigurację, ale nie działa. Mam interfejs i umowy w jednym zestawie, ale klasa implementująca interfejs jest w innym zestawie. Jaka jest najlepsza konfiguracja do korzystania z umów kodu z większą liczbą kontraktów i utrzymaniem kontraktów również w wydanym kodzie? Dziękuję Ci!! – Faber

4

Tryb składania w konfiguracji powinien być "Standardowy wymóg umowy".

+0

Przeczytałem, że ustawienie "Standardowa umowa wymaga", że umowy kodu nie są obecne w moim wydanym kodzie, ale chciałbym wstawić to również w moim wydanym kodzie. Czy w każdym razie muszę ustawić opcję "Standardowe wymagania umowy"? Dziękuję Ci! – Faber

+0

Możesz ustawić konfigurację inaczej dla debugowania i wydania. Jeśli chcesz przetestować kontrakt w wersji Release Build, musisz ustawić go również na "Standard Contract Required". –

+0

Aby dodać: zwykle nie trzeba weryfikować wymagań w środowisku produkcyjnym. Jeśli w niektórych przypadkach oczekiwane są błędne dane wejściowe, należy to wyraźnie potraktować w kodzie. Umowy kodowe służą do weryfikacji założeń, które powinny zawsze być prawdziwe. Tak więc, jest całkiem dobrze mieć umowy w środowiskach programowania, testowania i akceptacji, ale nie używałbym ich w środowisku produkcyjnym. –

Powiązane problemy