加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

activerecord – C#.NET中的Data Mapper问题

发布时间:2020-12-16 01:41:19 所属栏目:百科 来源:网络整理
导读:似乎DDD,存储库,数据映射器等周围发生了很多“噪音”…而且很少有“真实世界”的实现代码向我这样的新手展示什么是“好”,什么是“坏” . 我刚读完了Architecting Applications for the Enterprise这本书,这让人大开眼界.我目前在工作中使用Active Record模
似乎DDD,存储库,数据映射器等周围发生了很多“噪音”…而且很少有“真实世界”的实现代码向我这样的新手展示什么是“好”,什么是“坏” .

我刚读完了Architecting Applications for the Enterprise这本书,这让人大开眼界.我目前在工作中使用Active Record模式,并且一直在努力将其更改为使用Domain Model.我在本书中使用了很多架构示例,以及与本书相关的Northwind Starter Kit代码下载.

一切都很顺利,但现在我已经遇到了我的第一个“真实世界”数据映射器问题……也就是说,我的映射器只负责获取一个Entity对象并将其持久化到数据库,我现在有一个实体具有IList<>的对象还需要映射的集合.

主要的Entity对象是Expert,这里是代码:

public class Expert
   {    
          public int ID { get; set; }
          public string FirstName { get; set; }
          public string LastName { get; set; }
          public virtual IList<Case> Cases { get; protected set; }
   }

以下是Expert对象的实现,Case对象:

public class Case
   {
          public int ID { get; set; }
          public string Name { get; set; }
   }

不能比那简单得多.

现在,我为每个实体项都有一个DataMapper,但我的问题是,当我在ExpertDataMapper代码中映射Case集合时,被认为是“正确”的方法是什么?

在本书中,实际的SQL代码嵌入在ExpertDataMapper中,该代码调用ADO.NET代码,该代码获取IList集合中的所有Case项,并为每个项调用该代码一次.这是一些伪代码:

public virtual void Create(Expert expert)
   {
          // Insert expert in the Expert table
          SqlHelper.ExecuteNonQuery(ProviderHelper.ConnectionString,CommandType.Text,"SQL TO INSERT EXPERT",this.BuildParamsFromEntity(expert));

          // Insert individual Case items in the Case table
          foreach (Case c in expert.Cases)
          {
                 SqlHelper.ExecuteNonQuery(ProviderHelper.ConnectionString,"SQL TO INSERT CASE",this.BuildParamsFromEntity(order));
          }
    }

所以有两件事情错了,立即向我跳了出来:

>为什么ExpertDataMapper具有SQL调用(或存储的proc调用)来插入嵌入自身的Case?对我来说,这打破了封装的想法…… ExpertDataMapper应该不了解Case如何插入到数据库中,这就是CaseDataMapper的工作.

我假设ExpertDatMapper应该将Case插入CaseDataMapper的任务交付……但是我不知道一个DataMapper是否“正确”或“错误”来实例化另一个.这被认为是DataMappers的常见问题吗?我没有找到关于这个问题的指导,我认为这个问题很常见.

>如果我有100个与此专家关联的案例,那么创建了100个Case对象,并且针对数据库插入了100个语句?关于这一点对我来说感觉“错误”,违背了我更好的判断.现在,如果我足够幸运能够使用SQL Server 2008,我可以使用表值参数,它也不会那么糟糕,但我们现在正处于2005年.

所以,当谈到DataMappers时,我还没有在实体对象的DataMaper上看到任何具有简单集合关联的简单创建,更新等的具体实现.我正在阅读的书中没有代码可以支持它(那里的代码看起来对我很怀疑).

我已阅读并拥有Martin Fowler的EA EA书籍,所以请不要告诉我看那里.我也知道可以使用的ORM工具,所以我不需要自己实现DAL.我玩过EF 4.0,我喜欢它.但对于这个项目,我没有选择使用ORM工具.

大多数书籍/示例似乎都停留在同一个基本前提下,只要我的实体对象与通过DataMapper持久保存的表之间存在一对一的关联,世界就会使用域名呈现玫瑰色.模型方法……

如果我的所有实体都是一对一的,我不妨使用Active Record并完成它.

任何指导,建议,见解?对不起,这是一篇很长的帖子,但我在这里看到了其他类似问题的帖子,没有真正具体的答案或如何处理这里提出的问题的建议.

解决方法

这实际上取决于个人偏好和意见.一些开发人员会说你所展示的代码没有任何问题.其他人会说每个班级只对自己的州和财产负责.其他人也会说其他的东西.你应该使用适合自己的东西,即:你觉得自己感觉舒适.就个人而言,我更喜欢使用EF Code First,它允许我轻松创建我的模型类和我的数据库上下文类.然后我简单地使用存储库模式和负责提交事务的UnitOfWork类来抽象.此外,依赖注入模式是松散您的类的好方法.我的类紧密耦合存在重大问题,如果不使用IoC容器我无法解决.

到目前为止,This article是我见过的最佳资源.作者在创建一个完全可用且最重要的可扩展框架方面做得非常出色.

祝好运 :)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读