나는 비지니스 모델을 가진 도메인 모델을 만들고 EF 4.1이 나를 위해 영속성을 갖도록하려고한다. 여태까지는 그런대로 잘됐다.EF 4.1에서 DBSet <Something> 대신 DBSet <ISomething>을 사용할 수 있습니까?
문제는 모든 도메인 클래스에서 모든 속성이 공개로 노출된다는 것입니다. 어쨌든 튜토리얼에서 배운 것은 최소한입니다. 즉, 비즈니스 메서드가 아닌 부주의 한 프로그래머가 클래스 속성을 변경하지 않는다는 강력한 증거는 없습니다. 캡슐화가 위반되었습니다.
내가 뭔가를 소개했는데 TableAttribute는 인터페이스가 아니라 클래스에만 적용되므로 EF에 DBSet을 알릴 수 없습니다. 클래스에 TableAttribute를두고 있지만 어쨌든 뭔가를 구현하면 EF가 ISomething을 모르기 때문에 DBSet.Add()를 수행 할 수 없습니다.
내가 생각할 수있는 유일한 방법은 인터페이스를 사용하는 CRUD 용 EF 4.1 맨 위에 완전한 추상화 레이어를 작성하는 것입니다. 후드 아래에서 Something과 Isomething 사이의 형식 변환을 수행합니다. 그것은 EF의 디자인에 많은 복잡성과 커다란 구멍을 냈습니다. 아니면 뭔가 놓친 것 같아.
어떻게 해결할 수 있습니까?
감사합니다.
사실 내 질문에 두 가지 문제점을 다소 혼란스러워했다. 인터페이스를 사용한다는 아이디어는 읽기 전용 인터페이스 (게터 만 제공)와 EF 지원 읽기 - 쓰기 클래스가 있다는 것입니다. EF 상단의 얇은 층이 유형을 중재합니다. 그러나 종속 객체를 처리 할 때 공분산을 빠르게 입력하면 매우 빠르게 털이 나옵니다. –
엔티티에 직접 유효성 검사 로직이 있습니다. 사실, 제 사업 방식은 고전적인 OO 당 사업체에 있습니다. 따라서 Person은 이름, 나이, 분위기 및 CalculateMood()를가집니다. 십대 인스턴스가 있다고 가정하면 기분이 좋지 않을 것입니다. * 부주의 한 프로그래머가 * CalculateMood() 후에 Age = 35 *를 변경하면 EF는 데이터베이스에서 age = 35로 기분을 'Bad'로 갱신 할 것입니다. 내가 막고 싶은 부패 다. –
그리고 Person을로드하는 비즈니스 메소드 클래스 인 MoodHandler를 암시하는 경우 Person.Age를 읽은 다음 Person.Mood = "Bad"로 설정하면 문제가 발생합니다 1) 도메인 모델은 빈혈 (Fowler, 2003) 2) Person.Mood = "Bad"로 설정 한 후에 부주의 한 프로그래머가 Person.Age = 35를 변경하지 못하게합니다.클래스 전체의 여러 비즈니스 메소드는 트랜잭션에서 동일한 Person 인스턴스를 사용하므로 순수 효과를 예측하고 추론하기가 어렵 기 때문에 쉽게 단위 테스트를 수행 할 수 없습니다. –