문제

저는 최근에 새로운 웹 양식 프로젝트를 시작했고 DBML 참조에서 비즈니스 클래스를 분리하기로 결정했습니다.대신 내 비즈니스 계층 클래스는 개별 데이터 계층 메서드에 액세스하고 DTO 컬렉션을 반환합니다.따라서 데이터 계층은 다음과 같은 DTO를 투영할 수 있습니다.

(from c in dataContext.Customers
where c.Active == true 
select new DTO.Customer
{
   CustomerID = c.CustomerID,
   Name = c.CustomerName,
   ...
}).ToList()

DTO 개체를 구축하면 작업이 추가되지만 이는 비즈니스 및 데이터 계층 간의 긴밀한 바인딩에 대한 더 나은 접근 방식처럼 느껴지며 데이터베이스 없이 비즈니스 계층을 테스트할 수 있음을 의미합니다.

제 질문은 이것이 좋은 습관인가요?, DTO를 생성하는 방법(아마도 SQLMetal을 통해)이 있는지, 그리고 프로젝트가 진행되면서 어떤 다른 문제가 발생할 수 있는지입니다.

도움이 되었습니까?

해결책

이것이 모범 사례인지는 모르겠지만 응용 프로그램 내에서 LINQ 디자이너가 생성한 클래스 대신 자체 클래스를 사용하면 문제의 분리를 개선할 수 있다고 느꼈기 때문에 최근에 비슷한 코드를 작성했습니다. .

데이터 액세스 메서드에서 IList<Customer> 대신 IQueryable<Customer>를 반환하는 것을 고려할 수 있습니다.IQueryable<T>은 IEnumerable<T>에서 상속되므로 앱의 나머지 부분에서는 이를 매우 잘 처리할 수 있습니다.필요할 때 목록으로 변환할 수도 있습니다.

이것의 장점은 쿼리를 매우 쉽게 동적으로 수정할 수 있고 SQL Server에서 반환되는 데이터의 양을 최소화할 수 있다는 것입니다.

예:메소드 서명이 Queeryable 인 경우u003CCustomer> getCustomers () getCustomers ()를 호출하여 단일 고객을 얻을 수 있습니다.

이 예에서는 하나의 레코드만 데이터베이스에서 반환되지만 현재 귀하의 코드는 모든 고객을 반환하거나 원하는 모든 다른 항목을 충족하기 위해 별도의 메서드(따라서 매우 반복적인 코드)를 작성해야 할 것이라고 생각합니다. 필터링합니다.

다른 팁

제 생각에는 대부분의 경우 LINQ를 처리할 때 DTO 개체가 필요하지 않습니다.생성된 LINQ 클래스는 쉽게 테스트할 수 있습니다.LINQ는 동일한 쿼리를 사용하여 다양한 소스의 데이터를 쿼리하는 기능을 제공합니다.실제 DB 대신 개체 목록에 대해 쿼리를 테스트할 수 있는 기능을 제공합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top