대부분의 새로운 .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 덕분에 이것들은 정말 좋은 자료이지만 분명히 내가하려고했던 일에 대한 정당성을 원했던 것 같습니다. 그 칭의를 주셔서 감사합니다.
다른 사용자를로드하기 위해 새로운 사용자를 인스턴스화하는 것이 중요하지만 정적 메소드 호출 즉 User.Get (id)는 어떻게됩니까? 또한 ORM으로 NHibernate를 사용하여 더티 플래그 검사와 같은 문제를 해결하는 경향이 있습니다. – Owen
그래서 대개 DAO를 유지하거나 엔티티를 만들고로드하기 위해 팩토리 패턴과 같은 것을 사용합니다. 동일한 라이브러리 (서로 다른 네임 스페이스)에 DAO와 엔티티가있는 경우로드 메서드를 내부에 만들면 누설 된 추상화가 없게됩니다. –
당신은 UserDAO와 같은 것을 할 수 있다는 것을 의미합니다.데이터 집합을 가져 와서 엔터티의 내부로드 메서드에 전달한 다음 엔터티를 반환하는 ID를 가져옵니다. 물론 단순히 엔티티 자체에 정적 메소드를 두는 것은 기본적으로 똑같은 일을하고 수행합니다. –