2016-07-17 13 views
0

DB操作に複雑なアプリケーションがあります。私はDapper Micro-ORMを使用しています。私は疎結合コードを作りたいと思います。どうやってdapperでクラスの代わりにinterfaceを使うことができるのか教えてください。 私は、コードを次している:私はあなたがDapperC#をどうしようとしている何C#:DApper ORMでInterfaceを使用する方法

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実装の接続を介して、そこにいくつかの疎結合がある)データを取得し、各行をカテゴリインスタンスに変換します。

"Find"メソッドは、これらの具体的な実装で構成されるIEnumerable <カテゴリ>を返します。ただし、IEnumerable <T>は共変であるため、IEnumerable <カテゴリ>は、IEnumerable <にキャストすることができます。ICカテゴリ>。

これはその方法の消費者は、彼らが戻ってICategory実装のセットを取得しているよりも多くのものを知っている必要がないことを意味し、あなたの「検索」メソッドはIEnumerableを<ICategory>の戻り値の型を持つことができます(Dapperのは何を知っている必要があります取り込む具体的な型ですが、Findメソッドの呼び出し元は返されるICategoryの実装を知る必要はありません。

あなたのコードでは、わずかに変更される必要があります:

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

(それはまだ開いていない場合Dapperのは、あなたのための接続をオープンしますので、私は_conn.Open();行を削除したことに注意してください)。

0

疎結合コードではなく、汎用リポジトリパターンでORMリポジトリを使用する汎用実装を使用できます。あなたはGitHubのlink

下ASP.NETコアを使用する一般的な実装を持つことになり、ライブラリを見つけることができ

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; 
    } 

関連する問題