2008-10-22 4 views
1

대부분의 새로운 .NET 개발자와 마찬가지로 모든 곳에서 DataSets를 전달하기 시작합니다. 당신이엔티티에 DAO를 주입하는 것이 나쁜 것입니까?

public class User : UserDAL 
{ 
    //User specific methods 
} 
public class UserDAL 
{ 
    //Bunch of user specific properties 
    public User Load(int Id) 
    { 
    //Some low level ADO calls 
    } 
    private User LoadFromDataSet(DataSet ds) 
    { 
    //Load entity properties from DataSet 
    }  
} 

사용자가 ADO.NET을 사용하여 낮은 수준의 데이터 액세스 호출을 가지고 UserDAL 객체를 확장 즉 그래서

다음 진행은 DAL 기본 클래스를 확장 엔티티 객체를 생성하는 것이 있습니다.

이 구현은 사용자가 데이터 액세스 계층에 연결되어 있다는 것을 의미하며 조롱을 위해 별도의 엔터티, 데이터 액세스 개체 및 DAO 인터페이스를 사용하거나 필요한 경우 DAO를 쉽게 스왑 할 수 있음을 알게됩니다. 즉, 제네릭의 사용 및 반사 또는보다 일반적인 데이터 액세스의 일부를 해소 할 수있는 좋은 ORM으로

public UserDAO : IUserDAO 
{ 
    //Data access Functions 
} 

CRUD 작업은 내가에서 현재 어딘지 그래서 기본적으로 그 일부 제외하고,의

Public UserDAO<User> : BaseDAO<User>, IUserDAO 
{ 
    //BaseDAO deals with basic crud so more custom data access methods can go here 
} 

을 즉 내가 원하는 특정 IUserDAO를 해결하기 위해 IoC를 사용하는 것과 같은 다른 유용한 방법. 그러나이 구조의 장점을 보면서 이전 User.Load (1) 메서드 호출을 놓친 것처럼 느껴졌습니다.

내가 궁금해 한 것은 내 IUserDAO를 User 엔터티에 삽입하고 기본 CRUD 작업을 처리하는 것이 좋지 않을까하는 점이다.

필자는 POCO에서 User 엔터티는 전선을 통해 전달 된 문제가없고 Save(), Load() 등의 메서드를 추가하면 데이터 전송 객체의 의미에서 relavence를 갖지 않는다는 점을 이해했습니다.

하지만 내 엔티티는 일반적으로 DTO의 의미가없는 게으른로드 콜렉션이 있습니다. 또한 WFP를 사용하여 직렬화하려는 속성을 선택하고 선택할 수 있다고 생각합니다. 최소한 전선을 통해 보낼 필요가있을 때 새로운 UserDTO를 만들 수 있습니다.

기본적으로 그 문제를 제외하고 내 사용자 엔티티를 만드는 데있어 다른 문제는 DataAccess 관련 메소드를 포함합니까? 또한 내가 말할 수있는 것이 활성 레코드 패턴으로 언급 되었는가 아니면 다른 것인가를 명확히 할 수 있습니까?

는 편집 :

cristianlibardo 지적했다 : 잠재적 인 단점에 관해서는

코드를 peristence하는 큰 커플 링, resitence이있을 때 다음/업데이트 협회, 테스트 용이성 및 쿼리.

있을 것이다 큰 커플 링하지만 내가 같았다 somehting을 생각하고 어느 정도의 다음

public class User 
{ 
    IUserDAO userDAO; 
    public User() 
    { 
     userDAO = IoCContainer.Resolve<IUserDAO>; 
    } 
    public User(IUserDAO userDAO) 
    { 
     this.userDAO = userDAO; 
    } 
    //DAL methods 
} 

그래서 커플 링을 최소화해야하며, 테스트 용이성을 위해, 나는 그것을 볼 수 없습니다 문제는 단지 모의 DAO를 엔티티에 삽입 할 수 있기 때문입니다.

Brian Hasden 덕분에 이것들은 정말 좋은 자료이지만 분명히 내가하려고했던 일에 대한 정당성을 원했던 것 같습니다. 그 칭의를 주셔서 감사합니다.

답변

1

나는 같은 결론에 도달했습니다. 일단 인스턴스가 생기면 새로운 엔티티를 만들거나 이미로드 된 엔티티를 가지기 때문에 엔티티에서로드는 일반적으로 이해가되지 않습니다. 저는 저장 (생성 및 업데이트) 및 삭제 기능을 가진 엔티티를 아무런 문제없이 몇 년 동안 사용해 왔습니다. 즉, 다른 것들을하기 위해 여전히 DAO를 가지고있는 것이 유용하기 때문에 DAO와 엔티티를 정확히 결합하지는 못합니다. 대부분의 엔티티에서 저장 및 삭제 메소드는 DAO 저장 및 삭제 메소드를 호출하는 것입니다.

나는 일반적으로 엔티티가 변경되지 않았을 때 저장할 불필요한 호출을하지 않도록 속성이 변경된시기를 알기 위해 엔티티와 더티 플래그를 결합합니다.

일반적으로 사적인 구성원을위한 getter 및 setter가 포함되어 있지 않은 엔티티는 빈혈 도메인 모델로 작업하고 있음을 의미합니다. 상당히 논란의 여지가있는 반 패턴입니다.

당신의 IT에 대한 자세한 정보를 찾을 수 있습니다

:

http://www.martinfowler.com/bliki/AnemicDomainModel.html http://wrschneider.blogspot.com/2005/01/avoiding-anemic-domain-models-with.html http://www.dotnetjunkies.com/WebLog/richardslade/archive/2007/03/07/209401.aspx

+0

다른 사용자를로드하기 위해 새로운 사용자를 인스턴스화하는 것이 중요하지만 정적 메소드 호출 즉 User.Get (id)는 어떻게됩니까? 또한 ORM으로 NHibernate를 사용하여 더티 플래그 검사와 같은 문제를 해결하는 경향이 있습니다. – Owen

+0

그래서 대개 DAO를 유지하거나 엔티티를 만들고로드하기 위해 팩토리 패턴과 같은 것을 사용합니다. 동일한 라이브러리 (서로 다른 네임 스페이스)에 DAO와 엔티티가있는 경우로드 메서드를 내부에 만들면 누설 된 추상화가 없게됩니다. –

+0

당신은 UserDAO와 같은 것을 할 수 있다는 것을 의미합니다.데이터 집합을 가져 와서 엔터티의 내부로드 메서드에 전달한 다음 엔터티를 반환하는 ID를 가져옵니다. 물론 단순히 엔티티 자체에 정적 메소드를 두는 것은 기본적으로 똑같은 일을하고 수행합니다. –

1

예, 당신은 활성 레코드 (논리를 가진 객체로 만든 데이터베이스 행과 같은 소리를 설명하는지 데이터베이스 자체에서/자신을 유지). 그것은 효과적인 기술입니다. 의심의 여지가 없습니다.

잠재적 인 단점으로는 페리 스턴스 코드, 연결 추적/업데이트시의 resitence, 테스트 가능성 및 쿼리에 더 큰 결합이 있습니다.

0

도메인 클래스의 상속 모델에서 영속성을 유지하는 것은 이해할 수 있고 유지 보수가 가능한 코드를 작성하는 데 주로 사용됩니다.

지속성은 수업의 실제 책임과 직각으로 관련됩니다. 필자는 DAO에서 상속 된 접근 방식이 세계를 임의로 책임과 행동의 관점에서 차이가없는 클래스의 두 가지 범주로 나눕니다. 클래스가 어느쪽에 속하는지는 시간이 지남에 따라 자주 변경됩니다. 이 변경이 해당 클래스의 API 및 다른 클래스와의 상호 작용에 영향을 미치기를 원하지는 않습니다.

예 : 오늘 제품 클래스가 IoC를 통해 검색된 IPriceCalculator를 사용한다고 가정 해보십시오. 내일, 제품 별 알고리즘을 수정해야하므로 IPriceCalculator가 데이터 기반이됩니다. 이는 특히 가격 계산기에 중요한 기능을 제공하는 기본 클래스가있는 경우 특히 괴로운 변경 일 수 있습니다.

이 예제는 다른 고려 사항을 강조합니다. 즉, DAO 클래스에서 상속하면 User 클래스가 유용한 동작을 가질 수있는 Person 클래스를 상속하는 기능을 잃어버린 것입니다. (.NET 환경에서 MarshalByRefObject는 사람들이 상속해야하는 공통 기본 클래스로, 상속 기반 DAO 요구 사항과 상충 될 수 있습니다.) 단일 상속을 사용하면 상속하는 것이 개별적인 우려가되는 기능을 얻기에는 상속하지 않는 것이 좋습니다.

+0

DAO를 주입하고 본질적으로 엔티티에 메소드를 래핑하는 동안 DAO 클래스에서 상속 받음에 대해 논의합니다. – Owen

+0

저는 예제를 이해하지 못합니다. 내가 왜 IPriceCalculator가 DAO가 될지 알지 못한다. 알고리즘이 현재 제품 별이고 정보가 db의 데이터를 기반으로한다면 IPriceCalculator는 IProductDAO와 같은 DAO를 사용할 수 있지만 하나가되지는 않는다. . – Owen

관련 문제