Кодовые контракты с IoC в методе конструктора класса - PullRequest
3 голосов
/ 18 апреля 2011

Я новичок в Code Contracts и у меня есть вопрос о том, как интегрировать его с IoC. Я пытался использовать Code Contracts в простой тестовой программе (классический проект consolle), но теперь я хотел бы использовать его в своих официальных проектах. Вопрос заключается в следующем: если у меня есть контейнер, который предоставляет мой интерфейс службы в методе конструктора класса, как я могу использовать кодовые контракты для проверки переданных значений?

Классический сценарий может быть

[ContractClass(typeof(ArticoliBLLContract))]
public interfare IMyInterface
{
 void method1(int a)
 void method2(string b)
 void method3(bool c)
}


[ContractClassFor(typeof(IArticoliBLL))]
public abstract class MyContractsClass : IMyInterface
{

 public void method1(int a)
 {
  Contract.Requires<ArgumentOutOfRangeException>(a > 0,"a must be > 0");                                                    
 }

 public void method2(string b)
 {
  Contract.Requires<ArgumentOutOfRangeException>(!String.IsNullOrEmpty(b),"b must be not empty");                                    
 }

 public void method3(bool c)
 {
  Contract.Requires<ArgumentOutOfRangeException>(c == true,"c must be true");                                    
 }
}


 public class MyClass : IMyInterface
 {
  private ITFactory _factory = null;
  private IMyDAL _myDAL = null;

  public MyClass(ITFactory factory,IMyDAL myDAL)
  {
    if (factory == null)
      throw new ArgumentNullException("factory");

    if (myDAL == null)
      throw new ArgumentNullException("myDAL");

    _factory = factory; 
    _myDAL = myDAL;
  }

  public void method1(int a)
  {
    a = a*2;
  }

  public void method2(string b)
  {
    b = b + "method2";
  }

  public void method3(bool c)
  {
    c = false;
  } 
 }

В этом сценарии, где я могу проверить "factory" и "myDAL"? Есть ли способ поместить контракты в абстрактный класс, чтобы сохранить его в том же классе?

Спасибо !!!

1 Ответ

5 голосов
/ 18 апреля 2011

Требования к параметрам конструктора специфичны для конкретной реализации - так же, как сами конструкторы не наследуются, их обязательные параметры - нет.

Я бы выразил их как контракты внутри конструктора, как обычно, новот и все - они не должны быть частью набора абстрактных классов.(Рассмотрим другой конкретный подкласс, в котором методы реализованы без использования этих параметров вообще. Это вполне разумный сценарий, и ничто не должно завершиться неудачей только потому, что у вас нет этих значений.)

...