2016-07-17 1 views
0

DB 작업에 복잡한 응용 프로그램이 있습니다. Dapper Micro-ORM을 사용하고 있습니다. 느슨하게 결합 된 코드를 만들고 싶습니다. 어떻게 dapper로 클래스 대신 인터페이스를 사용할 수 있는지 제안 해주십시오. 나는 다음 한 코드 : 나는 당신이 DapperC#와 함께 할 려C# : DApper ORM을 사용하는 인터페이스

public IEnumerable<ICategory> Find() 
    { 
     using (IDbConnection _conn = GetConnection) 
     { 
      _conn.Open(); 
      return _conn.Query<ICategory>("usp_Category", commandType: CommandType.StoredProcedure); 
     } 
    } 

답변

1

로 교체 할

public IEnumerable<Category> Find() 
    { 
     using (IDbConnection _conn = GetConnection) 
     { 
      _conn.Open(); 
      return _conn.Query<Category>("usp_Category", commandType: CommandType.StoredProcedure); 
     } 
    } 

이 잘못되었습니다 :

_conn.Query<ICategory>("usp_Category", commandType: CommandType.StoredProcedure); 

당신은 가져 오기 위해 노력하고있다 ICategoryinterface이고 b가 될 수 없으므로 IEnumerable<ICategory>은 작동하지 않습니다. 당신이 기대하는대로 가득 채워져, 당신은 최대받을 수 있습니다 : IEnumerable<Category>. 당신은

ICategory ic = new ICategory(); 

IEnumerable<ICategory> 올바른 사용하지 않고, 어느 쪽도 아니 당신은 interface과의 차이를 이해할 필요가 있음을 이해하고, 어떤 수단을 통해 인출 할 수 없습니다 수 없습니다 구체적인 클래스, 같은 ICategory interface을 초기화 할 수 없습니다 concrete 클래스 및 해당 용도

0

코드를 느슨하게 연결하려고해도 어느 시점에서 각 ICategory 인스턴스의 구체적인 구현을 만들어야합니다.

제공된 예제에서는 Dapper 호출이 발생합니다. Dapper는 IDbConnection 구현 유형의 연결을 통해 쿼리에서 데이터를 가져 와서 일부 느슨한 연결을 수행하고 각 행을 Category 인스턴스로 변환합니다.

"찾기"메서드는 이러한 구체적인 구현으로 구성된 IEnumerable < 범주 >을 반환합니다. 그러나 IEnumerable <T>은 공변 (covariant)이므로 IEnumerable < 범주 >은 IEnumerable <ICategory>으로 캐스팅 될 수 있습니다.

이 그 방법의 소비자들이 다시 ICategory 구현의 집합을 얻고있는 것보다 더 많은 것을 알 필요가 없다는 것을 의미합니다, 당신의 "찾기"방법은 IEnumerable을 <ICategory>의 반환 유형을 가질 수 있습니다 (단정 무엇을 알 필요가 채울 구체적인 유형이지만 Find 메소드의 호출자는 반환 될 ICategory 구현을 알 필요가 없습니다.

코드는 약간 변경 될 필요가 :

public IEnumerable<ICategory> Find() 
{ 
    using (IDbConnection _conn = GetConnection()) 
    { 
     return _conn.Query<Category>("usp_Category", commandType: CommandType.StoredProcedure); 
    } 
} 

(아직 열려 있지 않은 경우 단정 한, 당신에 대한 연결을 열 때문에 나는 _conn.Open(); 라인을 제거합니다).

0

Loosely Coupled 코드 대신 일반 저장소 패턴을 사용하여 ORM 저장소를 사용하는 일반 구현을 사용할 수 있습니다.

public virtual IEnumerable<T> GetAll() 
    { 
     IEnumerable<T> items = null; 
     using (DbConnection cn = this.Connection) 
     { 
      cn.Open(); 
      items = cn.Query<T>("Select * from [TableName]"); 
     } 

     return items; 
    } 
당신은 link

GitHub의에서 ASP.NET 코어를 사용하여 일반적인 구현을해야합니다 라이브러리를 찾을 수 있습니다