2010-05-09 3 views
0

Repository 클래스는 싱글 톤 동작을 가지며 _db은 일회용 패턴을 구현합니다. 예외로 _db 개체는 첫 번째 호출 후에 처리되고 싱글 톤 동작으로 인해 _db의 다른 호출이 중단됩니다.클래스 디자인 질문 (일회용 및 싱글 톤 동작)

[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)] 
public class Repository : IRepository 
{ 
    private readonly DataBase _db; 

    public Repository(DataBase db) 
    { 
     _db = db; 
    } 

    public int GetCount() 
    { 
     using(_db) 
     { 
      return _db.Menus.Count(); 
     } 
    } 

    public Item GetItem(int id) 
    { 
     using(_db) 
     { 
      return _db.Menus.FirstOrDefault(x=>x.Id == id); 
     } 
    } 

    } 

내 질문에 싱글 톤 동작을 제거하지 않고 제대로 작동하려면이 클래스를 디자인 할 방법이 있습니까? Repository 클래스는 많은 양의 요청을 처리합니다.

답변

2

이 창조를 의미하고, 처리는 Repository 클래스의 범위에 있지 않습니다. 따라서 Repository은 해당 인스턴스를 삭제하면 안됩니다. using 문을 제거하면 문제가 없습니다. 다음과 같이 Repository을 작성하십시오.

public class Repository : IRepository 
{ 
    private readonly DataBase _db; 

    public Repository(DataBase db) 
    { 
     _db = db; 
    } 

    public int GetCount() 
    { 
     return _db.Menus.Count(); 
    } 

    public Item GetItem(int id) 
    { 
     return _db.Menus.FirstOrDefault(x=>x.Id == id); 
    } 
} 
+0

리포지토리 클래스는 하나의 역할을하므로 장기 실행 컨텍스트를 유지하는 것은 좋지 않습니다. 메모리 소비가 매우 빠르게 증가 할 수 있습니다. – user137348

+1

오랜 시간 동안 컨텍스트를 유지하는 것은 나쁜 습관에 동의합니다. 이 경우 두 가지 옵션이 있습니다. 1. 리포지토리를 싱글 톤으로 사용하지 말고 각 요청에 대해 새 인스턴스를 반환하십시오. 메소드에 대한 각각의 호출에서'DataBase' 클래스를 전달하십시오. 옵션 1로 갈 것입니다. dispose 문제 옆에, 저장소 (repository)를 싱글 톤 (singleton)으로 반환 할 때'DataBase'가 thread-safe한지 확인해야합니다 (멀티 스레드 환경). – Steven

+1

장기 실행 컨텍스트를 유지하는 것이 나쁜 관행이라면 왜 싱글 톤입니까? – Vitalik

2

당신이 할 때 :

using(_db) 

당신이 폐기은() 개체에서 호출됩니다 보장된다.

이 변경하여 _db에 대한 개인 정적 멤버와 정적 클래스를 사용하는 것이 좋습니다. 당신이 RepositoryDataBase 인스턴스를 제공

public static class Repository { 
    private static DataBase _db; 

    // static constructor 
    static Repository() { 
    _db = new Database(); 
    } 

    public static int GetCount() { 
    return _db.Menus.Count(); 
    } 
    public Item GetItem(int id) { 
    return _db.Menus.FirstOrDefault(x=>x.Id == id); 
    } 
}