2013-06-02 2 views
2

EF 컨텍스트에 대한 인스턴스 변수 또는 로컬 변수 중 어느 것이 더 낫습니까?

.. 내가 쓰고

이 나를 위해 기본적인 문제는 일반적으로하지만 난 대답을 잘 모릅니다 .. 나는 제목이 조금 나쁜 보이는 것을 알고 :)하지만 내 문제를 설명하는 방법을 잘 모릅니다 클라이언트 - 서버 통신을 위해 eneter 라이브러리를 사용하는 서버 응용 프로그램이며 DAL은 데이터베이스에서 데이터를 가져옵니다. 그것은 서버 응용 프로그램이므로 데이터베이스와 항상 통신해야하므로 어떤 방법으로 더 효과적인지 알 수 없습니다. (약 50 개의 클라이언트가 서버에 연결될 것입니다.)

저는 엔터티 프레임 워크를 사용하고 있으며 my mysql 데이터베이스에서 모델을 생성했습니다.

은 첫 번째 코드는

private MyEntities ent; 

    public DbHelper() 
    { 
    ent = new MyEntities(); 
    } 

    void Foo() 
    { 
     ent.Mytable.where...... 
     .... 

    } 

와 두 번째 유형의 코드가

void Foo() 
    { 
     using (MyEntities ent = new MyEntities()) 
     { 
      ent.Mytable.where... 
     } 

    } 

내가 문을 사용하거나 DAL 클래스에 대한 글로벌 인스턴스 변수를 생성하고 각각의 기능을 사용할 수 있습니다 여기에있다 ..?

+0

전역 변수가 아닙니다 ('정적'도 아닙니다). –

+0

@HenkHolterman, 내가 무슨 말을하는지 이해한다고 생각해. 나는이 변수를 수업 시간에 사용할 수있다 .. 그래서 변화가 필요하다면, 그것을 할 수있다. – ertan2002

답변

2

더 나은 아직, 당신의 DAL 클래스에는 IDisposable을 구현 : 다음

public sealed class MyDal implements IDisposable 
{ 
    private MyEntities ent = new MyEntities(); 

    void Foo() 
    { 
     ent.Mytable.where...... 
     .... 

    } 

    public void Dispose() 
    { 
     ent.Dispose(); 
    } 
} 

...

using(var dal = new MyDal()) 
{ 
    dal.Foo(); 
    //.... 
} 

을 받아 내는 IDisposable 밀봉 이유에 대한 here를 참조하십시오.

+0

답변을 주셔서 감사합니다. (var dal = new MyDal()을 사용하거나 내 dal이 지역 변수? – ertan2002

+0

@ ertan2002 당신이 묻고있는 것을 이해하는 것은 어렵습니다. 'using' 문 **의 변수는 ** 로컬 변수입니다. – spender

+0

아, 죄송합니다. 잘못 쓰셨습니다. Syd my dal dal처럼 mydal 클래스의 인스턴스 변수입니다. – ertan2002

1

두 가지 방법은 변경 내용 추적의 범위가 매우 다릅니다. 둘 다 똑같이 작동하면 WithNoTracking을 사용해야합니다.

첫 번째 코드와 같이 엔티티에 대한 멤버 변수를 만들 수 있습니다. 그러나 주위에 using(){} 문을 쓸 수 없기 때문에 포함하는 클래스는 IDisposable이어야합니다. 그리고 소비하는 클래스는 using(){} 안에 사용해야합니다.

+0

내 제목과 대답을 편집 해 주셔서 감사합니다. 변경 추적 및 다른 것들도 사용하려면 일반 저장소 디자인 패턴을 사용하려고합니다. – ertan2002

1

성능 측면에서는 중요하지 않습니다. 컨텍스트 인스턴스를 생성하는 실제 데이터베이스 상호 작용과 비교하면 매우 빠른 작업입니다.

그러나 데이터베이스 연결을 기본 리소스로 보유하고 있으므로 생성 된 컨텍스트를 폐기해야합니다. 당신은이 클래스를 사용할 수

public class DbHelper : IDisposable 
{ 
    private MyEntities ent; 

    public DbHelper() 
    { 
     ent = new MyEntities(); 
    } 

    public void Foo() 
    { 
     //... 
    } 

    public void Bar() 
    { 
     //... 
    } 

    public void Dispose() // implementation of IDisposable 
    { 
     ent.Dispose(); 
    } 
} 

: 당신의 희망이 DbHelper 클래스의 컨텍스트 멤버 일 경우에는 DbHelper 인스턴스 자체가 배치됩니다 컨텍스트를 처리 할 수 ​​있도록

이 클래스는 IDisposable를 구현해야합니다 그러면 using 블록이 다음과 같이 표시됩니다.

using (var helper = new DbHelper()) 
{ 
    helper.Foo(); 
    helper.Bar(); 
} // helper and helper.ent gets disposed now 
+0

완전한 IDisposable 패턴을 구현하지 않으면 클래스 **가 ** 봉인되어야합니다. – spender

+0

답변을 주셔서 감사합니다 slauma, 나는 당신에게 동일한 질문을하고 있는데, dbhelper 클래스의 위치 변수 대신 (var helper ...())를 사용해야합니까? 나는 어느 쪽이 더 나은지 결정하지 못한다. – ertan2002

+0

@Spender'sealed'는 일회용 패턴의 요구 사항이 아니다. - 보호 가상 처방 (bool disposing)은 다형성 일회용 유형의 표준이다 - 아마도 그것이 당신이 " 전체 일회용 패턴 "-이 경우 동의합니다. 어쩌면 일부 GC가있을 수 있습니다. –

1

이는 다른 방법과 현재 수행 방법에 따라 달라집니다. ORM을 사용하여 변경 사항을 유지하고 유지하려면 객체를 작성한 데이터 컨텍스트가 필요합니다. 또한 동일 작업을 두 번 쿼리하는 경우 ID 관리자가 동일한 객체 인스턴스를 제공하도록하려면 동일한 데이터 컨텍스트를 사용해야하므로 편리하게 유지해야합니다.마지막으로, 유형이 지연로드를 사용하고 작동 할 것으로 예상되면 데이터 컨텍스트를 삭제 한 경우 작동하지 않습니다.

그러나 변경 내용 추적, 지연로드 또는 ID 관리없이 읽기 전용으로 데이터에 액세스하려면 열심히 폐기하십시오. 그리고 아마도 이러한 기능을 가지고 있지 않은 마이크로 ORM과 같은 것을 고려해보십시오 (의도적으로 최소화하고 빠름).

+0

감사합니다. 그들은 매우 유용한 정보입니다. – ertan2002

관련 문제