문제

이 질문을 언어에 상관없지만 나는 C#남자 그래서 내가 사용하는 용어 POCO 을 의미하는 개체는 프리 데이터 저장,일반적으로 사용하 getter 및 세터 필드가 있습니다.

나는 그냥 재 내 도메인 모델을 수 super duper POCO 고 왼쪽의 부부와 함께 우려에 관한지 확인하는 방법을 제공 값을 의미가 신뢰하는 아고의 도메인에 있습니다.

예를 들어,종료 서비스의 초과하지 않아야의 종료는 계약의 서비스는 아래에 있습니다.그러나,그것은 다음과 같 위반의 솔리드를 체크를 넣어로 서비스입니다.종료 세터는 것을 언급하지 않는 것으로 수 검증을 수행 할 필요가 성장 내 POCO 클래스가 복잡 될 것입니다.

나는 몇 가지 솔루션(이 포스트에서는 답변)지만,그들은 그들의 단점이고 무엇인지 궁금은 몇 가지 좋아하는 접근이 딜레마를 해결?

도움이 되었습니까?

해결책

나는 당신이 나쁜 가정으로 시작한다고 생각합니다. 즉, 저장 데이터를 수행하는 것 외에는 아무것도하지 않고 접근자 외에는 방법이 없어야한다고 생각합니다. 객체를 갖는 요점은 데이터를 캡슐화하는 것입니다. 그리고 행동. 기본적으로 구조물이라면 어떤 행동을 캡슐화하고 있습니까?

다른 팁

나는 항상 사람들이 "검증"또는 "isvalid"방법에 대한 논쟁을 듣습니다.

개인적으로 나는 이것이 효과가 있다고 생각하지만 대부분의 DDD 프로젝트를 사용하면 일반적으로 객체의 특정 상태에 따라 허용되는 여러 가지 검증이 있습니다.

따라서 나는 대부분의 프로젝트가 수업 당 여러 유효성 검사기/상태로 끝나는 것으로 생각하기 때문에 "isvalidfornewcontract", "isvalidfortermination"또는 이와 유사하게 선호합니다. 그것은 또한 인터페이스가 없다는 것을 의미하지만 집계 된 유효성 검사기를 쓸 수 있습니다. 읽다 내가 주장하는 비즈니스 조건을 잘 반영합니다.

나는이 경우 일반적인 솔루션이 종종 초점을 맞추는 것을 정말로 믿는다. 떨어져 있는 중요한 것 - 코드가하는 일 - 기술 우아함 (인터페이스, 대의원 또는 무엇이든)에서 매우 작은 이익을 얻으려면. 그냥 내게 투표 해;)

나의 동료와 함께했는 생각했습니다.우리가 온 적이 좋은 그것의 이름이지만 우리는 그것을 관리자/판단한다.

관리자에 개체고 말의 모든 규칙을 위반했습니다.판사 것이 무엇인지 결정 그것에 대해 할 수 있습니다.이러한 분리를 우리의 몇 가지를 수행 할 것이다.그것을 우리는 모든 규칙을 한 곳에서(검사기)그러나 우리가 할 수있는 여러 사사를 선택에 의해 판단이 있다.

하나의 예를 사용하여 여러 개의 심판의 주위에 회귀하는 규칙을 말했다 고객이 있어야 합 주소입니다.이 표준은 세 tier app.UI 에서 계층의 판단하는 것 무언가를 생산하는 UI 를 사용할 수 있습을 나타내는 필드를 입력되어 있습니다.UI 판단하기하지 않았다는 예외가 있습니다.에서 서비스층이 있었다는 또 다른 판단한다.을 발견하면 고객에 주소를 가지지 않는 동안에 저장하지 않는 예외는 아니다.해당 지점에서 당신은 정말 당신을 중지해야에서 일을 진행하십시오.

또한 우리에게는 심사는 더 엄격한으로의 개체 상태 변경되었습니다.그것은 보험 응용 프로그램 중에 인용하는 프로세스 정책을 저장되는 것이 허용됩에서는 불완전한 상태입니다.하지만 일단 하는 정책이 될 준비가 활성 상태가 많은 것들을 설정합니다.그래서 인용하는 판단에 서비스 측되지 않았으로는 엄격한으로 활성화를 판단합니다.아직은 규칙에서 사용되는 관리자가 여전히 동일한 그래서 당신은 여전히 무엇을 말할지 않은 완벽한 경우에도 당신은 결정에 대해 아무것도 할 수 없습니다.

한 가지 해결책은 각 객체의 DataAccessObject가 유효성 검사기 목록을 가져 오도록하는 것입니다. 저장이라고 불리는 경우 각 유효성 검사기에 대한 검사를 사전 형성합니다.

public class ServiceEndDateValidator : IValidator<Service> {
  public void Check(Service s) {
    if(s.EndDate > s.Contract.EndDate)
      throw new InvalidOperationException();
  }
}

public class ServiceDao : IDao<Service> {
  IValidator<Service> _validators;
  public ServiceDao(IEnumerable<IValidator<Service>> validators) {_validators = validators;}
  public void Save(Service s) {
    foreach(var v in _validators)
      v.Check(service);
    // Go on to save
  }
}

이점은 매우 분명한 SOC입니다. 단점은 Save ()가 호출 될 때까지 수표를 얻지 못한다는 것입니다.

과거에는 일반적으로 ValidationService와 같이 자체적으로 서비스에 대한 유효성 검사를 위임했습니다. 이것은 원칙적으로 여전히 DDD의 철학을 듣습니다.

내부적으로 여기에는 유효성 검사기 모음과 validate ()와 같은 매우 간단한 공개 메소드 세트가 포함되어있어 오류 객체의 모음을 반환 할 수 있습니다.

아주 간단히, c#에서 이와 같은 것

public class ValidationService<T>
{
  private IList<IValidator> _validators;

  public IList<Error> Validate(T objectToValidate)
  {
    foreach(IValidator validator in _validators)
    {
      yield return validator.Validate(objectToValidate);
    }
  }
}

유효성 검사기는 기본 생성자 내에 추가되거나 ValidationServiceFactory와 같은 다른 클래스를 통해 주입 할 수 있습니다.

나는 그것이 아마도 논리에 가장 적합한 곳이라고 생각하지만, 그것은 단지 나입니다. 모든 조건을 확인하고 True/False를 반환하는 일종의 isvalid 방법을 가질 수 있습니다. 어쩌면 어떤 종류의 errormessages 컬렉션이있을 수 있지만 오류 메시지가 실제로 도메인 모델의 일부가 아니기 때문에 IFFY 주제 일 수 있습니다. 나는 ROR과 함께 일을하면서 약간 편견이 있습니다. 그것은 본질적으로 모델이하는 일입니다.

또 다른 가능성은 각 수업을 구현하는 것입니다.

public interface Validatable<T> {
  public event Action<T> RequiresValidation;
}

그리고 각 클래스의 각 세터가 설정 전에 이벤트를 높이도록하십시오 (아마도 속성을 통해이를 달성 할 수 있음).

장점은 실시간 유효성 검사 검사입니다. 그러나 지저분한 코드와 누가 부착을 해야하는지 불분명합니다.

또 다른 가능성이 있습니다. 유효성 검사는 도메인 개체의 프록시 또는 데코레이터를 통해 수행됩니다.

public class ServiceValidationProxy : Service {
  public override DateTime EndDate {
    get {return EndDate;}
    set {
      if(value > Contract.EndDate)
        throw new InvalidOperationexception();
      base.EndDate = value;
    }
  }
}

장점 : 인스턴트 검증. IOC를 통해 쉽게 구성 할 수 있습니다.

단점 : 프록시 인 경우 검증 된 속성이 가상이어야하는 경우 데코레이터 모든 도메인 모델이 인터페이스 기반이어야합니다. 유효성 검사 클래스는 약간 헤비급이됩니다. 프록시는 클래스를 상속해야하며 데코레이터는 모든 방법을 구현해야합니다. 이름 지정과 조직은 혼란 스러울 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top