C#:如何使用接口与dapper ORM

时间:2016-07-17 06:32:16

标签: c# dapper

我对DB操作有复杂的应用程序我正在使用Dapper Micro-ORM,我想制作松散耦合的代码。请建议我如何使用接口而不是使用dapper的类。 我有以下代码:

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

我想用

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

3 个答案:

答案 0 :(得分:2)

您尝试对DapperC#执行的操作不正确:

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

您正在尝试抓取IEnumerable<ICategory>,这将无法解决,因为ICategoryinterface并且无法按照您的预期填充,您最多可以获得: IEnumerable<Category>。您无法像具体类一样初始化ICategory interface,这是不可能的

ICategory ic = new ICategory();

IEnumerable<ICategory>不是正确的用法,并且无法通过任何方式获取,以了解您需要了解interfaceconcrete类之间的区别及其用法< / p>

答案 1 :(得分:0)

即使你想松散地耦合你的代码,在某些时候你将不得不创建每个ICategory实例的具体实现。

在您提供的示例中,Dapper调用将在何处发生。 Dapper将从查询中获取数据(通过类型IDbConnection实现的连接,因此存在一些松散耦合)并将每一行转换为Category实例。

&#34;发现&#34;方法将返回IEnumerable&lt; Category&gt;,包含这些具体实现。但是,因为IEnumerable&lt; T&gt;是协变的,IEnumerable&lt; Category&gt;可以转换为IEnumerable&lt; ICategory&gt;。

这允许你的&#34;查找&#34;返回类型为IEnumerable&lt; ICategory&gt;的方法,意味着该方法的使用者不需要知道任何东西,而不是获取一组ICategory实现(Dapper需要知道填充的具体类型,但Find的调用者方法不需要知道将返回什么ICategory实现。)

您的代码只需稍微更改一下:

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

(请注意,我删除了_conn.Open();行,因为Dapper会为您打开连接(如果尚未打开)。

答案 2 :(得分:0)

我们可以使用泛型实现,而不是松散耦合的代码,它将使用具有通用存储库模式的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;
    }

您可以在GitHub下找到使用ASP.NET Core进行通用实现的库link