我对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);
}
}
答案 0 :(得分:2)
您尝试对Dapper
和C#
执行的操作不正确:
_conn.Query<ICategory>("usp_Category", commandType: CommandType.StoredProcedure);
您正在尝试抓取IEnumerable<ICategory>
,这将无法解决,因为ICategory
是interface
并且无法按照您的预期填充,您最多可以获得: IEnumerable<Category>
。您无法像具体类一样初始化ICategory interface
,这是不可能的
ICategory ic = new ICategory();
IEnumerable<ICategory>
不是正确的用法,并且无法通过任何方式获取,以了解您需要了解interface
和concrete
类之间的区别及其用法< / 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