유창한 인터페이스가 속성보다 융통성이 있으며 그 이유는 무엇입니까?


15

EF 4.1 코드 우선 학습서에는 다음 코드가 제공됩니다.

public class Department
{
    public int DepartmentId { get; set; }
    [Required]
    public string Name { get; set; }
    public virtual ICollection<Collaborator> Collaborators { get; set; }
}

그런 다음 유창한 인터페이스가 더 유연하다고 설명합니다.

데이터 주석은 사용하기가 쉽지만 훨씬 더 융통성을 제공하는 프로그래밍 방식을 사용하는 것이 좋습니다.

유창한 인터페이스를 사용하는 예는 다음과 같습니다.

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Department>().Property(dp => dp.Name).IsRequired();
    modelBuilder.Entity<Manager>().HasKey(ma => ma.ManagerCode);
    modelBuilder.Entity<Manager>().Property(ma => ma.Name)
        .IsConcurrencyToken(true)
        .IsVariableLength()
        .HasMaxLength(20);
}

유창한 인터페이스가 왜 더 나은지 이해할 수 없습니다. 진짜야? 내 관점에서 볼 때 데이터 주석이 더 명확하고 더 의미 론적 느낌이납니다.

내 질문은 유창한 인터페이스가 속성을 사용하는 것보다 특히 더 나은 옵션 인 이유는 무엇입니까?

(참고 : 유창한 인터페이스의 전체 개념에 익숙하지 않으므로 이에 대한 사전 지식을 기대하지 마십시오.)

참조 : http://codefirst.codeplex.com/


이 질문은 실제로 유창한 인터페이스에 관한 것이 아닙니다. 차이점은 속성 사용과 일반 코드의 차이점입니다. 코드가 유창하지 않으면 질문에 대해 크게 변경되지 않습니다.
svick

@svick fluent interface는 기본적으로 정상적인 코드이지만 다른 방식으로 표현합니다. 우리는 평범한 코드로 물건을 지정하는 것에서 속성으로 옮겨갔습니다. 이제 유창한 인터페이스를 통해 일부는 역 추적하고 코드로 물건을 다시 지정하는 것처럼 보입니다. 속성 대신 코드를 사용하는 이유를 이해하고 싶습니다. 유창한 인터페이스는 속성에서 벗어나 다시 모든 것을 다시 코딩해야합니까?
Tjaart

답변:


13

데이터 주석은 정적입니다. 예를 들어이 메소드 선언은 런타임에 변경할 수 없습니다.

  [MinLength(5)]
  [MaxLength(20,ErrorMessage="Le nom ne peut pas avoir plus de 20 caractères")]
  public new string Name { get; set; }

유창한 인터페이스는 동적 일 수 있습니다 :

   if (longNamesEnabled)
   {
      modelBuilder.Entity<Manager>().Property(ma => ma.Name)
        .HasMaxLength(100);
   }
   else
   {
      modelBuilder.Entity<Manager>().Property(ma => ma.Name)
        .HasMaxLength(20);
   }

속성 사이에서 코드를 재사용 할 수 있습니다.


2
왜 같은 속성의 길이 (또는 다른 속성)가 런타임에서 변경 될 것이라고 생각하십니까?
Yusubov

1
@ ElYusubov : 코딩 시간에 필드 길이를 모르는 시나리오부터 시작하겠습니다.
Wyatt Barnett

@WyattBarnett : 일부 서비스 또는 유형이 지정되지 않은 외부 소스에서 도메인 매개 변수를 동적으로 가져 오는 경우에만 필드 길이를 변수로 사용하는 것이 좋습니다. 그러나 도메인 속성을 동적으로 처리하려면 방어 적 코딩 방식이 필요합니다.
Yusubov

1
@ElYusubov에는 길이를 제외하고 정확히 동일 해야하는 두 가지 속성이 있으므로 동적으로 설정하는 함수에 전달합니다. 이것이 저자가 더 유연하다고 불렀던 이유입니다.
개렛 홀

1
@ElYusubov의 경우 프로젝트 설정에서 필드 길이를 설정하여 app.config 또는 web.config에 제공 할 수 있습니다. 그런 다음 데이터베이스 필드 길이가 변경된 경우 앱을 다시 컴파일하고 재배치하지 않고 .config 파일의 길이를 변경할 수 있습니다.
Kyralessa

8

나는 그 진술이 광범위하게 적용되어야한다고 생각하지 않는다. Code First에만 해당됩니다. Code First에서 데이터 어노테이션에는 유동 API에서 사용 가능한 기능의 서브 세트 만 포함됩니다. 다시 말해, 유창한 API를 통해서만 수행 할 수있는 특정 모델 구성이 있습니다.

예를 들어 다음은 주석을 사용하여 지정할 수없는 것들입니다.

  • DateTime 속성의 정밀도
  • 숫자 속성의 정밀도 및 스케일
  • 고정 길이의 문자열 또는 이진 속성
  • 비 유니 코드로서의 문자열 속성
  • 관계의 삭제시 동작
  • 고급 매핑 전략

개인적으로 MVC와 같은 다른 기술도 이러한 이점을 활용할 수 있기 때문에 가능하면 유효성 검사 관련 데이터 주석을 사용하는 경향이 있습니다. 다른 모든 것에는 유창한 API를 선호합니다.


유창한 API를 사용하여 수행 할 수있는 작업의 예를 제시 할 수 있습니까? 그들이 왜 이런 식으로 선택했는지 아는 것도 흥미로울 것입니다. 필자는 기존 API와 엔티티 프레임 워크에 비해 플루트 API를 이해하려고 노력하는 것은 단지 예일뿐입니다. 왜 그들이 속성보다 선호하는지 알고 싶습니다. 나에게 속성은 더 정확하고 읽기 쉬운 것 같습니다.
Tjaart

1
@Tjaart 몇 가지 예를 추가했습니다. 이를 설계하는 동안 두 가지 주요 동기 부여 원칙이있었습니다. 먼저 개발자가 선택할 수 있도록 허용하십시오. 어떤 사람들은 속성을 POCO의 위반으로 간주하고 다른 사람들은 선언적 속성을 좋아합니다. 둘째, 기존 속성을 활용하고 일반적인 시나리오에 새로운 속성 만 도입하십시오. 위에서 언급 한 예가 비교적 드문 것에 동의 할 것입니다.
bricelam

OnDelete 동작은 유창한 API에서만 사용할 수있는 것으로 나타났습니다. 그들이 왜 이런 식으로 선택했는지 생각할 수 있습니까? 이것이 바로이 질문으로 임하려고하는 것입니다. 프로젝트간에 클래스를 공유하는 경우 POCO 위반이 적절한 이유 일 수 있습니다. 속성을 사용하면 원하지 않는 엔터티 프레임 워크 종속성이 발생할 수 있습니다.
Tjaart

@Tjaart, 나는 정확한 이유를 기억하지 못한다. Code First 기능의 끝을 향해 팀에 합류했으며 디자인을 위해 여기에 없었습니다. 그래도 팀의 다른 누군가가 무게를 측정 할 수 있는지 확인할 것입니다.
bricelam

1

귀하의 질문에 대한 답변이 링크에 제공됩니다.

그런 다음이 방법 내에서 도메인에 적용 할 수있는 제약 조건을 프로그래밍 방식으로 정의하십시오.

기본적으로 프로그래밍 방식이 엔터티를 더 많이 제어하는 ​​경우 특성 대 프로그래밍 방식을 사용하는 것이 다소 선호됩니다. 그러나 모델을 장식하기 위해 속성을 추가하는 사용자 정의 방법이 있습니다.

이 방법을 사용할 때 테이블과 열 사이의 관계를 설명 할 수도 있습니다. 결론적으로, 도메인을보다 세밀하게 제어하려는 경우 EF4.1과 함께 제공되는이 새로운 접근 방식을 사용할 수 있습니다.

그러나 일반적인 유효성 검사 시나리오의 경우 대부분의 경우를 다루는 것이 강력하기 때문에 속성을 적용하면 제대로 작동합니다. 또한 시간을 절약 할 수 있습니다.


프로그래밍 방식이 어떻게 더 많은 통제력을 제공하는지 설명 할 수 있습니까? 나는이 시점에서 실제로 그것을 얻지 못했습니다.
Tjaart

예를 들어, ".IsConcurrencyToken (true)"-속성 정의에서이를 수행하는 방법은 무엇입니까?
Yusubov

[ConcurrencyCheck] <-실제로 더 단순 해 보입니다
Tjaart

잘 이해한다면, "테이블과 열 사이의 관계"를 어떻게 설명하겠습니까?
Yusubov

[ForeignKey ( "PersonId")] <-like, 아마도 .HasForeignKey (t => t.ProjectId)만큼 간단하지는 않지만, 필요한 것은 ForeignKey ()가 유창한 인터페이스처럼 람다를 취하는 것입니다. 여전히 왜 한 쪽이 다른 쪽보다 더 나은지 설명하지 않습니다.
Tjaart

0

내 생각은 데이터베이스에서 관계가 생성되는 방법을 명시 적으로 설명하기 때문에 코드 첫 번째 구현에 유창한 API를 권장하는 것입니다. 데이터 주석을 사용하는 경우 Entity Framework에서 생성 한 데이터베이스가 예상과 다를 수 있습니다. 초기 예제는 매우 간단하므로 데이터 주석 방법을 사용합니다.


예상치 못한 데이터베이스와 유창한 인터페이스가 어떻게 이런 일이 발생하지 않도록하는 예를 들어 줄 수 있습니까?
Tjaart
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.