제출물로 채워졌으며 Fluent NHibernate (이전 NHibernate 경험 없음)를 배우기 시작했습니다. 내 프로젝트에서 나는 커플 링 등을 줄이기 위해 인터페이스를 프로그래밍하고있다. 즉, "모든 것"은 구체적인 유형 (메시지 대신 IMessage) 대신 인터페이스를 의미한다. 이것의 뒤에있는 생각은 의존성을 조롱 할 수있게 됨으로써 그것을 더 테스트 가능하게 만드는 것을 돕는 것입니다.Fluent NHibernate와 맵핑하는 동안 인터페이스 프로그래밍
그러나 (Fluent) NHibernate는 구체적인 클래스 대신 인터페이스에 매핑하려고 할 때이를 좋아하지 않습니다. 문제는 간단합니다 - 유창함 위키에 따르면, 전형적인 자동 생성 된 기본 키를 얻기 위해 예를
int Id { get; private set; }
에 대한 나의 클래스의 ID 필드를 정의하는 스마트입니다. 내가
int Id { get; set; }
로 같은 줄이있는 인터페이스에 액세스 레벨을 지정할 수 없으며, 그합니다 (콘크리트 클래스에서 세터 개인을 부정 생각 - 그러나, 단지 구체적인 클래스와 함께 작동 아이디어는 NHibernate가 DB에 의해 할당 된 ID를 설정해야한다는 것입니다).
지금 당장은 공개 자로 하여금 글쓰기의 유혹을 피하려고 노력할 것입니다.하지만 누구에게도 "적절한"최상의 모범 사례가 될 수있는 아이디어가 있습니까? Hibernate만이 인터페이스로 프로그래밍하는 동안 쓸 수있는 적절한 기본 키 필드?
내가 mookid 제임스 그레고리에서 아래의 두 가지 답변 후, 내가 아니라 잘못된 궤도에있을 수 있습니다 이해하는 바로는
업데이트 - 나 개체 당 인터페이스를하는 이유가 안된다 내가 지금 가지고있는 것처럼. 그게 다 잘되고 잘됐다. 내 질문에 그때가 될 것 같아요 - 어떤 엔터티에 대한 인터페이스에 대해 100 % 프로그램에 대한 이유가 없습니까? 그리고 이것이 정당화 될 수있는 단일 상황이 있다면, (Fluent) NHibernate로 이것을 수행 할 수 있습니까?
나는 중요하지 않기 때문에 묻습니다. 답변 주셔서 감사합니다. "
public interface ISomeEntity
{
int Id { get; }
}
귀하의 구체적인 클래스는 여전히뿐만 아니라 세터를 구현할 수 있으며, 당신이 당신의 인터페이스에 프로그래밍되어 있기 때문에 당신은 세터를 호출하지 않습니다 : :)
내가 존경하는 일부 개발자가 실수로 엔티티 인터페이스 방지 패턴을 사용했기 때문에 재미있다. 루키들보다 프로가 더 많은 실수를 범한 이유는 루키가 처음부터 인터페이스가 중요한 이유를 간신히 알고 있기 때문입니다. –
엔티티의 인터페이스를 만들지 않으면 엔티티의 동작을 어떻게 테스트합니까? 보다 구체적으로, 당신은 어떻게 그 개체의 의존성을 조롱합니까? –
사람들은 인터페이스가 프로그래밍이 아니라 구현이라고 말하면 인터페이스 언어 구조를 의미하지는 않습니다. 그들은 가능한 한 많이 사용하는 코드를 블랙 박스에 넣으려고합니다. 나는. 사전에 열거자를 사용할 때 movenext가 호출되기 전에 Current가 throw되지 않는다고 가정하지 않습니다. 정의되지 않았으며 변경 될 수 있습니다. – stonemetal