설치

2017-10-02 3 views
0

나는 개체가 이미 null의 경우 사용하여 문을 초기화하는 하나의 방법이 있어야합니다 같은 느낌이 코드가 좀 덜 중복이 될 수 있도록 노력하고 있습니다설치

public static CMSContent GetContent(string title, ContextDb db = null) 
    { 
     if (db == null) 
     { 
      using (db = new ContextDb()) 
      { 
       return db.CMSContents.FirstOrDefault(c => c.Title == title && !c.Archived); 
      } 
     } 
     else 
     { 
      return db.CMSContents.FirstOrDefault(c => c.Title == title && !c.Archived); 
     } 

    } 

호출 문이 반환 된 개체에 대해 추가 db 요청을 실행하려고하거나 여러 호출이있을 수 있으며 연결이 여러 연결을 완화하기 위해 미리 설정되어 있기 때문입니다.

return 문을 복제 할 수 없으면 db가 null이고 then을 사용하면 더 좋을 것입니다.

+0

이것은 설계상의 혼란으로 보입니다. 이 방법은 간단하지만 좋은 방법이지만 그 방법의 책임은 무엇인지 혼란 스러울 것 같습니다. 데이터를 검색하거나 컨텍스트를 만드는 것이 목적입니까? 방법을 너무 많이 사용하면 위와 같은 문제가 발생합니다. – Nkosi

+0

내가 프로그램하는 것을 선호하는 방식이 아니지만 오래된 프로젝트이고 팀에 속해 있기 때문에 다시 작성할 수는 없습니다. – Tod

+0

그러면 당신은 구속력이 있습니다. using 문은 범위를 기반으로하므로 해당 메서드 내에서 해당 메서드 내에서 db가 만들어지면 null이며 null이 아닌 경우 제공된 db가 사용 범위 내에 있는지 여부를 알 수있는 방법이 없습니다. – Nkosi

답변

0

using의 설명서를 보면 finally 절에 Dispose()을 호출하여 동일한 동작을 얻을 수 있습니다.

: Nkosi의 의견과 관련하여 - 초기에 db이 Null인지 기억해야합니다.

public static CMSContent GetContent(string title, ContextDb db = null) 
    { 
     var _db = db ?? new ContextDb(); 

     try 
     { 
      return _db.CMSContents.FirstOrDefault(c => c.Title == title && !c.Archived); 
     } 
     finally 
     { 
      if (db == null) _db.Dispose(); 
     } 
    } 
: 결과 코드 내가 편집으로, 게오르그의 답변을했다, 그리고 약간 그것을 손질
public static CMSContent GetContent(string title, ContextDb db = null) { 
    var dbWasNull = (db == null); 
    try { 
     if (dbWasNull) { 
      db = new ContextDb(); 
     } 
     return db.CMSContents.FirstOrDefault(c => c.Title == title && !c.Archived); 
    } 
    finally { 
     if (dbWasNull) { 
      db.Dispose(); 
     } 
    } 
} 
+1

문제는 OP가이 방법 밖에있는 DB에 액세스하려고하면 오류가 발생합니다. db가 이미 처리되었을 것입니다. – Nkosi

+0

'db == null'이 참이면 좋은 행동입니다. (이 문제를 해결하기 위해 코드를 편집했습니다. –

0

return 문이 더 이상 중복되지 않은 적어도 개선이 ... 정말 확실하지

더 나은 답변을 찾기 위해 많은 사냥을했는데 찾을 수 없습니다. 이것을 제외하고 싱글 톤으로 관리되는 연결 풀을 가질 수도 있습니다. 그러나 여기에는 실용적이지 않으며 희망적으로 이것은 다른 누군가를 돕는 역할을 할 것입니다.

나는 컨텍스트를 처리하지 않고 GC가 그렇게하도록하는 아이디어를 보았지만, 그렇게했다면 밤에 잠을 잘 수 있다고 생각하지 않았습니다.

public static CMSContent GetContent(string title, ContextDb db = null) 
{ 
    return (db ?? new ContextDb()).CMSContents.FirstOrDefault(c => c.Title == title && !c.Archived); 
} 

네 - 그렇게하지 마십시오. 분명히 EF5는 자동으로 연결을 닫지 만, EF6은 그렇지 않으며 일회용이면 폐기해야합니다.