2011-04-18 4 views
3

코드 계약에서 새로 왔으며 IoC와 통합하는 방법에 대한 질문이 있습니다. 간단한 테스트 프로그램 (고전적인 consolle 프로젝트)에서 코드 계약을 사용하려했지만, 이제는 공식 프로젝트에서 코드 계약을 사용하려고합니다. 질문 : 클래스의 생성자 메서드에서 서비스 인터페이스를 제공하는 컨테이너가있는 경우 코드 계약을 사용하여 전달 된 값을 확인하려면 어떻게해야합니까?클래스 생성자 메서드에서 IoC와 코드 계약

고전적인 시나리오는 내가 "공장"과 "myDAL"를 확인하실 수 있습니다이 시나리오에서는

[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; 
    } 
} 

을 수 있을까? 계약을 추상 클래스에 두어 같은 클래스에 보관할 수 있습니까?

감사합니다.

답변

5

생성자 매개 변수에 대한 요구 사항은 특정 구현에만 적용됩니다. 생성자 자체는 상속되지 않으므로 필수 매개 변수는 필요하지 않습니다.

나는 그들을 정상적인 것처럼 생성자 내에서 계약으로 표현 하겠지만 그게 전부입니다. 그들은 추상 클래스 집합 계약의 일부가되어서는 안됩니다. (이러한 매개 변수를 전혀 사용하지 않고 메서드를 구현 한 또 다른 하위 클래스를 생각해보십시오.이 메서드는 매우 합리적인 시나리오이며 값이 없기 때문에 아무 것도 실패하지 않습니다.)

+0

감사합니다! 서브 클래스로 시도 할게! – Faber

관련 문제