2009-03-28 3 views
3

나는 보통 데이터베이스 연결을 직접 만들고`{} {} '을 사용하여 수명을 수동으로 제어하려고합니다. 예를 들면 다음과 같습니다.비즈니스 개체에 데이터베이스 연결을 캡슐화했는지 여부를 확인하려면?

이렇게하면 적절하게 정리해야하는 리소스를 사용하고 있습니다. 그러나 이것은 반복적 인 노력을 많이하게됩니다. 비즈니스 객체 내부에서 SQL 연결을 생성하고 IDisposable을 구현하려고합니다. Dispose() 메서드에서 연결을 닫습니다.

using(BusinessObject myBusinessObject = new BusinessObject()) { 
    // do stuff with myBusinessObject 
    ... 
} 

문제는 내가 사용하고있는 것을 볼 때까지 비즈니스 객체를 삭제해야한다는 것이 명백하지 않을 수 있다는 것입니다.

어떻게할까요?

답변

4

비즈니스 개체는 데이터베이스와 관련하여 (또는 완전히) 멍청해야합니다. 비즈니스 개체를 데이터베이스에 유지하는 방법을 알고 액세스 개체 계층 (저장소 또는 데이터 컨텍스트)을 구현하고 각 비즈니스 개체에 코드를 넣는 대신 연결 논리를 유지해야합니다. 저장소 또는 컨텍스트는 일회성이어서 자체적으로 정리할 수 있습니다. @ Marc의 제안에 따라 작업 단위 패턴을 따르는 것이 좋습니다.

LINQtoSQL, nHibernate, Subsonic 등을 사용하거나 자신의 글쓰기를 고집한다면 좋은 데이터 계층을 구조화하는 방법에 대한 아이디어가 필요합니다. 개인적인 경험을 통해 기존 기술을 사용하는 것이 자신의 저작 및 유지 관리보다 훨씬 쉽다는 것을 알 수 있습니다.

+0

대답 주셔서 감사합니다. 여기에 대해 생각하는 코드는 매우 간단합니다. 과거에 NHibernate를 사용했는데,이 프로젝트를 위해 거기에 가고 싶지 않다. 그러나 당신이 말했듯이, 아마 소스를 통한 스핀이 좋은 운동이 될 것입니다. – dnewcome

+0

nHibernate가 너무 많이 보인다면 LINQtoSQL을 고려하십시오. 내 경험에 비추어 볼 때 매우 가볍습니다.L2S 엔티티를 DTO로 간주하거나 부분 클래스/메소드로 확장하여 본격적인 비즈니스 객체로 사용할 수 있습니다. – tvanfosson

3

글쎄 먼저 저장소에 연결을 남기고 싶습니다.

두 번째로 개체 연결에 연결을 유지하지 않을 것입니다. 작업 단위 (예 : 단일 메서드)에서만 사용합니다. 기회는 (풀링으로 인해) 어쨌든 동일한 물리적 연결을 되 찾을 수 있습니다. 시스템은 이미 그런 것들을 처리 할 수있는 먼 길을 간다. 그렇게하지 않아도된다.

더 까다로운 경우가 트랜잭션인데, TransactionScope은 db-transaction 객체를 전달하는 것보다 훨씬 쉽습니다.

+0

나는 연결을 유지하는 것에 동의합니다. 나는 수동으로 생성 된 연결을 사용했을 때와 똑같은 비즈니스 객체의 수명을 유지할 것이다. 문제는 API를 사용하는 다른 사람들이 그렇지 않을 수도 있다는 것입니다. BO를 호출 할 때 연결을 만들거나 닫을 수 있습니까? 그렇다면 아마도 트랜스를 원할 것입니다. 후에. – dnewcome

+0

@Marc - LINQToSQL을 사용하는 것이 더 좋을 지 모르지만, TransactionScope에 대한 경험이별로 없었습니다. 어쨌든 TableAdapters를 사용하면 거의 모든 트랜잭션이 분산 된 트랜잭션으로 승격되고 방화벽으로 인해 DB로 작동하는 데 문제가없는 것으로 나타났습니다. – tvanfosson

+0

@tvanfosson - 좋은 의견; 그들이 말하는대로 : YMMV; - p –

0

비즈니스 개체는 그것이 지속되는지 여부를 알아야하거나 신경 써야한다고 생각하지 않습니다. 개별 Persistent Business Object는 더 큰 작업 단위 (UOW)의 일부인시기를 알 수 없습니다. 그것은 서비스 계층의 책임입니다. 연결을 비즈니스 오브젝트 밖으로 두십시오. 서비스 계층은 일반적으로 연결 풀에서 연결을 획득하고, 트랜잭션 경계를 설정하고, 커밋 또는 롤백하고, 정리하는 올바른 장소입니다.

관련 문제