使用 Microsoft.Practices.EnterpriseLibrary.Data IResultSetMapper<T>
Posted
技术标签:
【中文标题】使用 Microsoft.Practices.EnterpriseLibrary.Data IResultSetMapper<T>【英文标题】:Using Microsoft.Practices.EnterpriseLibrary.Data IResultSetMapper<T> 【发布时间】:2011-11-30 01:01:23 【问题描述】:我决定让 Microsoft.Practices.EnterpriseLibrary 旋转一下,而不是滚动我自己的 ADO.Net 帮助程序类。查看文档和示例项目,我真的很喜欢我所看到的。
对于我的项目,我将为所有数据访问调用存储过程。特别是,我将严重依赖 ExecuteSprocAccessor
我的问题涉及使用 IResultSetMapper
以下是我认为正确的使用方法:
class MyPOCO : IResultSetMapper<MyPOCO>
int ID get; set;
string Name get; set;
public IEnumerable<MyPOCO> MapSet(IDataReader reader)
// HELP ME HERE! PLEASE!
请告诉我如何填写这个空白!如果我正确地解决了这个问题(通过让我的 POCO 实现 IResultSetMapper),或者我刚刚完成!
谢谢!
【问题讨论】:
【参考方案1】:你真的需要使用IResultSetMapper<T>
吗?您的 POCO 是否足够简单,可以使用 IRowMapper<T>
构建?如果您只有没有层次结构或嵌套集合等的简单对象,那么IRowMapper<T>
可能就足够了。尽管IResultSetMapper<T>
确实为您提供了最大的灵活性。
我不会让 POCO 实现 IResultSetMapper<T>
。我会创建一个单独的映射器类。这消除了您的 POCO 类对 Enterprise Library 的依赖。此外,POCO 类现在独立于映射。您可以在不影响 POCO 的情况下更改映射或映射器。
public class MyPocoMapper : IResultSetMapper<MyPoco>
public IEnumerable<MyPoco> MapSet ( IDataReader reader )
using(reader) // Dispose the reader when we're done
while (reader.Read())
yield return new MyPoco()
MyProperty1 = reader.GetString(
reader.GetOrdinal("MyPropertyX")),
MyProperty2 = reader.GetString(1)
;
【讨论】:
【参考方案2】:可能是这样的
public IEnumerable<MyPOCO> MapSet(IDataReader reader)
while(reader.Read())
yield return new MyPOCO()
ID = reader.GetInt(0),
Name = reader.GetString(1)
;
如果您的查询看起来像“select ID,Name from ...”
【讨论】:
以上是关于使用 Microsoft.Practices.EnterpriseLibrary.Data IResultSetMapper<T>的主要内容,如果未能解决你的问题,请参考以下文章
在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?
Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)