문제

저장소의 각 방법에 블록을 사용하고 있습니다. 참조 방법을 교차하고 싶다면 다른 데이터 컨텍스트를 초기화하는 것이 모범 사례에 위배되는 것 같습니다. 내가 무엇을 잘못하고 있습니까? 메소드에 블록을 사용하는 대신 클래스에서 데이터 콘텍스트를 선언하면 폐기 할 전력을 잃지 않을 것입니다.

public IList<something> GetSomething()
{ 
   using (DB db=new DB())

   { ...GetListofSomethingElse(id)

   } 
}

public IList<somethingelse> GetListofSomethingElse(int id)
{ 
    using (DB db=new DB())
   {
     ... return IList 

   } 
}
도움이 되었습니까?

해결책

사용 명령문을 사용하지 않더라도 여전히 명시 적으로 처분 할 수 있습니다. 그러나 데이터 컨텍스트를 폐기하지 않더라도 이러한 방법을 상호 참조하면 여전히 새로운 데이터 컨텍스트가 생성됩니다. 사용량에 따라 좋은 일이거나 아닐 수도 있습니다. 데이터 컨텍스트의 상태 관리 측면과 방법을 서로 분리할지 여부를 생각해보십시오. 항상 새로운 컨텍스트를 생성하지 않으려면 컨텍스트를 매개 변수로 취하는 버전으로 메소드를 과부하 시키십시오.

주목하십시오 당신은 보통 아닙니다 필요 데이터 컨텍스트를 폐기합니다, 나는 idisposable을 구현하는 것을 처분하는 경향이 있지만.

다른 팁

실제로, 나는 그것이 당신의 저장소에서 데이터 컨텍스트를 작성하고 처분하는 것이 정확하지 않으며 의미 적으로 (또는 어떻게 말해야 하는가)라고 생각합니다.

내 말은 : 당신이 당신의 저장소의 모든 방법에서 DB에 새로운 연결을 열면, 당신은 그것을 잘못하고 있습니다. 이것은 너무 벌금이납니다. 저장소 클래스는 사용중인 '컨텍스트'에 대한 지식이 없습니다. 저장소는 연결을 열고 닫거나 거래를 시작하고 거래 할 책임이 없어야합니다. 맥락은 왕이며, 저장소는 그것이 사용되는 곳의 맥락에 대한 지식이 없습니다. 따라서 IMHO 새 데이터 컨텍스트 객체를 열고 폐쇄 / 처분하는 것은 응용 프로그램 계층 또는 서비스 계층의 책임입니다. (거래에도 동일하게 적용됨).

그래서 이것은 내가하는 방법입니다.

using( ISession s = theSessionFactory.OpenSession() )
{
    ICustomerRepository cr = RepositoryFactory.GetCustomerRepository(s);

    Customer c1 = cr.GetCustomer(1);
    Customer c2 = cr.GetCustomer(2);

    // do some other stuff
    s.StartTransaction();

    cr.Save (c1);
    cr.Save (c2);

    s.Commit();

}

(이것은 실제 코스가 아닙니다. 그리고 issession이 커밋 방법이 없기 때문에 컴파일조차하지 않습니다. 내 드리프트. ;))

사용 진술은 구문 설탕입니다. 드디어 섹션에서 Dispose () 호출을 사용하여 시도/마침내 블록으로 컴파일됩니다. 예외가 발생하더라도 처분이 호출되도록합니다.

'사용'명령문을 사용하지 않고 클래스에서 .dispose ()를 호출 할 수 있습니다. 일반적으로 저장소의 처분 방법 에서이 작업을 수행합니다.

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