asp.net-mvc – 为服务层设计DI(构造函数注入)的存储库
|
我正在构建一个MVC3应用程序,尝试使用IoC和构造函数注入.我的数据库(到目前为止)大约有50个表.我正在使用EF4(带有POCO T4模板)作为我的DAC代码.我正在使用存储库模式,每个表都有自己的存储库.我的服务层中的服务类是使用这些存储库注入的. 问题:我的服务类正在增加他们需要的存储库数量.在某些情况下,我正在接近10个存储库,它开始闻起来. 是否有一种设计存储库和服务类的通用方法,使得服务不需要这么多的存储库? 这是我的想法,我只是不确定哪一个是对的: 1)这是一个标志,我应该考虑将我的存储库组合/分组到表的相关部分,减少每个服务类的数量或依赖存储库.但是,这种方法的问题在于它会使我的存储库膨胀并使其复杂化,并使我无法使用所有存储库的通用接口(数据检索/更新的标准方法). 2)这是我应该考虑根据我的存储库(表)将我的服务分成组的标志.问题在于我的一些服务方法共享通用实现,并且跨类打破这些可能会使我的依赖项复杂化. 3)这表明我不知道自己在做什么,并且有一些我根本无法看到的根本错误. 更新:有关我如何实现EF4和存储库的想法,请查看codeplex上的this sample app(我使用过version 1).然而,看一下(和这里)的一些评论,看起来我需要做更多的阅读以确保这是我想要的路线 – 听起来可能不是. 解决方法Chandermani is right您的某些表可能不是核心域类.这意味着除了单一类型的父实体之外,您永远不会搜索该数据.在这些情况下,您可以将它们称为“复杂类型”而不是完整的实体,EF仍然会照顾您.
我希望你不要从头开始写这些. EF 4.1已经实现了the Repository Pattern(DbSet)和the Unit of Work pattern(DbContext).旧版本也可以,但可以通过将这些属性更改为IDbSet,轻松调整DbContext模板以提供干净的可模拟实现. 我看过几篇教程文章,人们仍然写自己的文章.这对我来说很奇怪,因为它们通常不提供理由,除了它们是“实现存储库模式”的事实. 为FindById这样的访问方法编写这些存储库的包装器使得访问稍微容易一些,但正如您所看到的那样,大量的工作可能很少有回报.就个人而言,除非我发现有一些有趣的域逻辑或复杂的查询需要封装,否则我甚至不会费心直接使用Linq来对抗IDbSet.
即使您选择使用自定义查询包装器,您也可以选择简单地注入DbContext,并让服务代码实例化它所需的包装器.您仍然可以模拟数据访问层,您将无法模拟包装器代码.我仍然建议你注入不那么通用的,因为复杂的实现正是你希望能够在维护中考虑因素或用模拟代替的东西. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – ASP.NET MVC的Windows Azure存储模拟器连接
- asp.net-mvc – 如何更改ASP.NET MVC中的默认验证错误消息?
- 在asp.net应用程序中管理与数据库的连接
- asp.net – GridView’GridView1’触发的事件PageIndexChan
- asp.net – Handles子句需要在包含类型或其基类型之一中定义
- 在Asp.Net Membership中手动更改用户名
- asp.net – ResolveUrl / Url.Content在Classic Asp中等效
- ASP.NET CheckBoxList DataBinding问题
- 获取ASP.NET中所有活动会话的列表
- 我如何在ASP.NET MVC中使用Application_Error?
- asp.net – Sys.WebForms.PageRequestManagerSer
- asp.net – IIS Express(WebMatrix)打开外部连接
- asp.net-web-api – 从ASP.NET Web API ASP.NET
- asp.net – HttpContext.Current如何工作?
- asp.net – 想要在ModalPopExtender之上显示Upda
- ASP.NET -- WebForm -- HttpResponse 类的方法和
- asp.net-web-api – 将Application Insight与ASP
- .NET MVC屏蔽密码文本框
- asp.net – 单个应用程序中的多个母版页
- ASP.NET MVC Controller FileContent ActionResu
