- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在重构一个 MVC 项目以使其可测试。目前, Controller 直接使用 Entity Framework 的上下文对象来请求所需的数据。我开始对此进行抽象,但它不起作用。最终我有一个 IService 和一个 IRepository 抽象,但为了描述这个问题,我们只看一下 IRepository。许多人建议使用返回其中一些函数的接口(interface):IQueriable<...>、IEnumerable<...>、IList<...>、SomeEntityObject、SomeDTO。然后当人们想要测试服务层时,他们可以使用一个不去数据库返回这些的类来实现接口(interface)。
问题:对实体使用 linq 我的工具集中有延迟(延迟)加载。这实际上非常有用,因为我的 Controller 操作函数知道 View 需要哪些数据,而且我没有要求超过要求的数据。然而,linq to anyelse 没有延迟加载。因此,当我的 IRepository 函数返回上述任何内容时,我就失去了延迟加载。我用 "GetAnything"和 "GetAnythingDeep" 等函数扩展了我的界面,但这还不够:它必须更细粒度。对于相同类型的对象,这将产生大约 5-6 个函数,具体取决于我想要在结果中获得的属性。也许可以是带有一些“包含属性”参数的通用函数,但我也不喜欢那样。
最终 atm 我认为如果我想让它可测试,将导致效率低得多或代码复杂得多。听起来不对。
顺便说一句,我正在考虑将实体模型背后的数据源更改为 xml 或某些对象数据源,这样我就可以将 linq 保留到实体。我发现它不支持开箱即用......这也很可悲:这意味着 Entity Framework 意味着数据库源 - 不是真正有用的抽象。
具体例子:
实体对象:文章、语言、人物。关系:文章可以有 1-N 种语言和一个人(发布者)。
View 模型对象:ArticleDeepViewModel:包含文章的所有属性,包括语言和人名(用于查看文章,因此不需要人的其他属性)。
将返回此 View 的 Controller 操作应该从某处获取数据。
修改前的代码:
using (var context = new Entities.Articles())
{
var article = (from a in context.Articles.Include("Languages")
where a.ID == ID
select new ViewArticleViewModel()
{
ID = a.ID,
Headline = a.Headline,
Summary = a.Summary,
Body = a.Body,
CreatedBy = a.CreatedByEntity.Name,
CreatedDate = a.CreatedDate,
Languages = (from l in context.Languages select new ViewLanguagesViewModel() { ID = l.ID, Name = l.Name, Selected = a.Languages.Contains(l) })}).Single();
this.ViewData.Model = article;
}
return View();
修改后的代码可能是这样的:
var article = ArticleService.GetArticleDeep(ID);
var viewModel = /* mapping */
this.ViewData.Model = viewModel;
return View();
问题是 GetArticleDeep 应该返回一个包含 Languages 和整个 Person 对象的 Article 对象(它不应该知道 viewmodel 只需要人的名字)。到目前为止,我还有 3 种不同的文章 View 模型。例如,如果有人想查看文章列表,则无需获取语言、正文和其他一些属性,但是获取出版商的名称(位于深处)。在“可测试”代码之前, Controller 操作可能只包含 linq to entities 查询并使用延迟加载、Include 函数、使用子查询、引用外部属性 (Publisher.Name) 获取他们需要的任何数据......因此,没有对数据库的不必要查询,也没有从数据库传输不必要的数据。
IService 或 IRepository 接口(interface)应该提供什么来获取 3-4 个不同级别的 Article 对象或有时这些对象的列表?
最佳答案
不确定您是否打算坚持延迟加载,但如果您想要一种灵活的方式将预加载集成到您的存储库和服务层中,请先查看这篇文章:
http://blogs.msdn.com/b/alexj/archive/2009/07/25/tip-28-how-to-implement-include-strategies.aspx
他基本上为您提供了一种构建强类型包含策略的方法,如下所示:
var strategy = new IncludeStrategy<Article>();
strategy.Include(a => a.Author);
然后可以将其传递到存储库或服务层上的通用方法中。这样您就不必为每种情况使用单独的方法(即您的 GetArticleDeep
方法)。
这是一个使用上述包含策略的存储库方法示例:
public IQueryable<Article> Find(Expression<Func<Article, bool>> criteria, IncludeStrategy<Article> includes)
{
var query = includes.ApplyTo(context.Articles).Where(criteria);
return query;
}
关于asp.net-mvc - 使用 IRepository 进行 Entity Framework 测试 - 延迟加载问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3734233/
我见过两种不同的创建通用存储库的方法。这两种方法(优点和缺点)之间有什么区别?请忽略方法上的差异,因为我对 之间的差异感兴趣 public interface IRepository where T
我正在为我的 mvc web 应用程序寻找一个简单的 IRepository 接口(interface),我在周围做了很多搜索,有多少人就有多少意见。所以我决定请教专家 如果能推荐一个常用的IRepo
我试图从基础开始,但无法理解如何创建此最小起订量对象。 public class TestRefMedicalSpecialty { private Mock> mockRefMedical
我已经为多个域实现了 IRepository 接口(interface),但我不知道如何调用具体方法。 代码如下: public interface IRepository where T : cla
我知道有一个 Unit Of Work 是在抽象之上有一个抽象 (DbContext),这肯定是一种反模式,或者至少不是必要的。 我有以下问题: 我有一个像这样的通用 IRepository: pub
我希望在一个小项目中使用 IRepository 模式(由 NHibernate 支持,如果它重要的话)。域是一个简单的域,有意让我专注于理解 IRepository 模式。单独的域类是 Movie,
我想知道使用 IRepository 模式处理关系数据的推荐方法是什么。 我的数据库有下表,列名在括号中: 计划(PlanId、名称、创建日期、修改日期、ViewId) 区域(AreaId、名称、nT
我正在设计我的 ASP.NET MVC 应用程序,我遇到了一些有趣的想法。 我见过的许多示例都描述和使用了存储库模式 ( IRepository ),所以这就是我在学习 MVC 时所做的方式。 现在我
当实际加载数据时,我对使用“IRepository 模式”时感到有些困惑。 目前我有这样的事情: public class MainViewModel : ViewModelBase { //
我使用提到的存储库编写了以下方法在以下博客文章 (http://www.codecapers.com/post/Using-RavenDB-with-ASPNET-MVC.aspx) 中使用 Rave
我是 Repository 概念的新手,遇到了一些问题。我在我的 MVC 应用程序中创建了简单的存储库类。 public interface IRepository where TEntity
我想模拟一个内部存储库的工作单元接口(interface),用于单元测试目的。到目前为止,我可以像下面那样做。 namespace Liquid.Service.UnitTest { usin
什么是 IRepository?为什么使用它,简短的例子不会有什么坏处。 最佳答案 MVC 促进关注点分离,但这并不止于 MVC 级别。 数据访问本身就是一个问题。应该是在MVC的M位,即模型中完成。
可以说我的 IService 拥有 IRepository 拥有的一切,而且还有一些特定的操作吗? 代码如下: public interface IRepository { T Add(T E
我已经实现了存储库模式并且效果很好。 public interface IServiceRepository { User GetUser(int id); User GetUser(
我正在使用通用存储库接口(interface),它允许我添加、查找、更新和删除不同类型的对象。然后我实现了两个具体的存储库,并且可以在不更改应用程序的情况下切换它们。一切都奇妙地脱节。但我遇到了一个障
我一直在尝试想出一种方法来编写适用于各种数据存储的通用存储库: public interface IRepository { IQueryable GetAll(); void Sav
在典型的三层系统中,GUI->DOMAIN->DAL,IRepository 属于哪里?它属于 DOMAIN 还是 DAL。我对正交性和服务层了解不够,不知道有什么区别。(编辑)请允许我澄清一下。 I
我有以下项目布局: MVC UI |...CustomerController (ICustomerRepository - how do I instantiate this?) Data Mode
在 Orchard CMS 中使用 IRepository<>很常见。 所以我问自己,使用 IRepository<> 有什么好处?及其 Fetch()方法而不是简单地使用 Linq to SQL查询
我是一名优秀的程序员,十分优秀!