문제

.NET 3.5SP1의 VB6 응용 프로그램을 다시 작성하려고합니다. VB6 앱은 매우 잘 작성되었으며 데이터 계층은 저장 프로 시저를 기반으로합니다. LINQ2SQL/ENTITY FRAMEWORK/NHIBERNATE/SUBSONC와 같은 자동으로 가고 싶습니다. 물론, 나는이 도구들 중 어느 것도 닥친 프로젝트 이외의 다른 도구를 사용하지 않았습니다.

내가이 모든 선택에 가질 수있는 잠재적 인 문제는 속도입니다. 예를 들어, 지금 당장 단일 행 (또는 전체 목록)을 검색하려면 다음 스프로를 사용합니다.

ALTER PROCEDURE [dbo].[lst_Customers]
 @intID     INT = NULL
,@chvName   VARCHAR(100) = NULL
AS

SELECT   Customer_id, Name
FROM dbo.Customer
WHERE (@intID IS NULL OR @intID = Customer_id)
 AND (@chvName IS NULL OR Name like ('%' + @chvName + '%'))
ORDER BY name

LINQ2SQL/엔티티 프레임 워크/nhibernate/subsonic에서 단일 행을 검색하려면 이러한 솔루션이 전체 목록을 클라이언트에게 가져와 필요한 행을 찾아야합니까?

그렇다면 큰 데이터 도메인이있는 응용 프로그램의 데이터 액세스 전략에 대한 합의는 무엇입니까?

도움이 되었습니까?

해결책

나는 Devil 's Advocate를 연주하고 적어도 저장된 절차를 고수하는 것을 고려할 것을 권장합니다. 이는 재 작성 및 디버그 할 필요가없는 코드 덩어리를 나타냅니다. 이 기사 우리 자신의 [TM] Joel Spolsky는 완전한 재 작성을 피하기위한 일관된 주장을합니다.

'Greenfield'프로젝트가 주어지면 원하는 것을 사용할 수 있으며 O/R Mapper는 좋은 선택 일 수 있습니다. 그러나 이미 VB6 앱이 잘 작성되었다고 언급했습니다. Sprocs가 잘 작성된 경우, 일부 앱을 무료로 받고 이미 디버깅을 제공하며 데이터베이스 스키마를 재활용하고 데이터 마이그레이션으로 인한 대부분의 통증을 피할 수 있습니다.

파울러 엔터프라이즈 애플리케이션 아키텍처 패턴 유지 보수 문제를 일으키지 않고 저장된 절차와 잘 작동하는 데이터 액세스 계층을 설계하기위한 좋은 포인터를 제공해야합니다.

이것은 Oracle/Java 앱에서 매우 일반적으로 수행됩니다. 많은 레거시 Oracle 앱에는 PL/SQL에 저장된 프로 시저 코드의 큰 본문이 있습니다. 이것은 Oracle Forms의 클라이언트 서버 시대에 표준 아키텍처였습니다. Java의 Sprocs 용 래퍼를 작성하고 래퍼 위에 사용자 인터페이스를 구축하는 것이 일반적입니다.

다른 포스터 중 하나는 Subsonic이 Sprocs의 포장지를 생성 할 수 있다고 언급했습니다.

옛날 옛적에 나는 PL/SQL 스프로스에 대한 개념 증명 Java/JDBC 래퍼를 생성 한 데이터 사전 해킹을 할 기회가있었습니다. 그렇게하기가 어렵지 않다는 것을 감안할 때, 나는 당신이 이것을하기 위해 선반에서 내릴 수있는 것들에 약간의 선택이 없다는 것을 알게되어 놀랄 것입니다. 꼬집음으로 자신의 글을 쓰는 것이 그다지 어렵지는 않습니다.

다른 팁

나는 LINQ-to-SQL, 엔티티 프레임 워크, 또는 nhibernate에서 말할 수 없지만 Subsonic과 사랑에 빠졌습니다. 그것에 대한 나의 경험은 압도적으로 긍정적이었습니다.

이러한 도구가 일반적으로 작동하는 방식은 관리 코드에서 매개 변수화 된 쿼리를 구축하고 클래스에서 해당 액세스를 캡슐화 한 다음 해당 클래스를 앱에 노출시키는 것입니다. 완전히 생성 된 Dals Rock.

매개 변수화 된 쿼리를 사용하면 "전체 목록을 클라이언트로 가져와 필요한 행을 찾아야 할 우려가 처리됩니다"라는 우려가 처리됩니다. 그들은 지원합니다 where 조항 및 기타 필터링이 필요한 행을 얻습니다. 당신은 동등한 일을 할 수 있습니다 select * from foo, 그러나 당신은 그 모드에 갇혀 있지 않습니다.

즉, Subsonic은 직접 테이블/뷰 액세스에 박스를 사용할 때 전체 행을 가져옵니다. ~할 수 있었다 일부 시나리오에서는 단점이 되십시오. 그러나 저장된 Procs를 통한 귀하의 액세스는 문제가되지 않습니다. 다른 사람과 대화 할 수는 없지만 Subsonic은 도움이됩니다. SPs 클래스 모든 Procs를 캡슐화하여 방법으로 호출 할 수 있으며 적절한 것을 반환합니다. DataTableS, 필요에 따라 수동으로 구문 분석 할 수 있습니다. Procs의 DAL 클래스 목록을 초기화하는 방법도 있습니다. 따라서 Proc가 테이블/보기와 직접 일치하는 데이터 세트를 반환하는 경우 수동 처리 없이도 클리너 구문을 가질 수 있습니다.

(Subonic, 그건 그렇고, "모든 것에 대한 Procs"를 치료했습니다. 나는 이제는 일반적으로 과거에했던 것처럼 Crud Procs를하는 데 거의 시간을 보내지 않고 복잡한보고를 위해 그것들을 사용합니다. 그러나 당신의 마일리지는 아마 그리고 실제로는 다양 할 것입니다.)

Subsonic을 사용하여 모든 코드를 생성하여 기존 저장된 Procs에 액세스하는 것이 좋습니다.이 방법으로 새로운 데이터 액세스 계층으로 인해 회귀 가능성이 줄어 듭니다. 그런 다음 SubSonic에서 생성하는 ActivereCord 클래스를 사용하여 모든 새로운 기능에 액세스 할 수 있습니다. 이것은 나에게 가장 안전하고 빠른 접근 방식 인 것 같습니다.

NHibernate 권장 사항에 동의하지 않습니다. 저장 절차 작업에 적합하지 않기 때문입니다.

우리는 엔티티 프레임 워크를 ORM으로 사용하려고 노력했으며 도메인 구동 개발과 함께 사용하려고 할 때 여러 문제를 해결했습니다. LINQ에서 SQL에는 몇 가지 제한 사항이 있으며 Microsoft는 다음 릴리스에서 지원을 중단 할 것입니다.

쿼리가 저장된 절차에 있다면 이미 잘 최적화 된 가능성이 높습니다. 그리고 아마도 그들은 결합, 하위 쿼리 등에 SQL 표현을 자유롭게 사용합니다.

그런 종류의 효율성과 표현성을 복제, 정확히, ORM 유형의 추상화 레이어를 사용하면 도구에 완전히 익숙하지 않은 경우 도전이 될 것입니다.

나머지 앱을 똑바로 얻은 후에는 항상 쿼리를 리팩터링 할 수 있습니다. 그리고 ORM 세계는 당신이 도착할 때 옵션이 확실히 다를 수있을 정도로 빠르게 변하고 있습니다.

저자 중 한 명인 Rob Connery에 따르면 Subsonic은 신속한 응용 프로그램 개발을 지원하기 위해 더 많이 작성되었으며 대규모 응용 프로그램에 대해서는 덜 작성되었습니다. 나는 지역 사회의 지원과 시도 된 진정한 테스트 프레임 워크뿐만 아니라 Nhibernate와 함께 가고 있다고 말하고 싶습니다. nhibernate 물건을 설정할 때 www.dimecasts.net에서 좋은 정보를 얻을 수 있습니다.

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