C#学习教程:EF5中的UOW和存储库模式使用存储库包装dbcontext并使用工作单元类包装存储库:http://www.asp.net/mvc/overview/older-versions/getting-started-with-ef使用-5--MVC-4/implementing-most-library-and-unit-of-pattern-in-an-asp-net-mvc-app但是,在这个页面上,它指出dbcontext已经是UOW模式和存储库模式的组合:https://msdn.microsoft.com/en-us/library/system.data.entity.dbcontext(v=vs.103).aspx所以如果dbcontext已经解决了这些模式解决的问题,为什么要用EF5重新发明轮子如何实施这些模式?此外,在本教程中,UnitOfWork类似乎没有显示UOW应该提供的任何好处。例如,它指出:“这样,当一个工作单元完成时,您可以调用该上下文实例上的SaveChanges方法,并确保协调所有相关更改。”但它似乎无缘无故地包装了DbContext。我想我错过了什么。我在这个实现中没有看到任何协调......如果出现问题,事情如何“回滚”?不要使用其他UoW/存储库抽象层正如OP正确指出的那样,实体框架(类似于NHibernate和其他ORM)已经为您提供了数据库的抽象,同时提供事务性“工作单元”和“存储库”。UoW/存储库抽象的附加层是反模式,应该不惜一切代价避免。它有很多问题,其中最重要的是:但是,但是,但是......我需要通过模拟我的存储库来进行单元测试不,你不需要。只需使用具有特定内容的数据库进行测试即可。如果您想更快,请使用内存数据库(例如SQLite、Effort等)。EF不会强制执行未在数据关系中表达的业务逻辑...要强制执行此类逻辑,您必须围绕EF上下文构建某种OUW/Repository/。不,你不应该。在基础设施抽象层(例如工作单元或存储库)中实现业务逻辑是完全错误的。另请注意,没有任何有价值的业务逻辑的简单CRUD式操作不需要遍历所有“箍层”,即避免这种模式:数据库→无行为实体→DTO→视图模型→视图编辑字段视图→视图模型→DTO→BehaviorlessEntity→Database直接从控制器中的ORM中加载视图需要的“视图模型”形状,直接从控制器中保存即可。关于抽象不必要的抽象和类似的箍是邪恶的。它们使您的代码混乱、束缚您的手、泄漏、增加代码大小,从而增加代码中的错误数量,而没有提供任何附加值。当它们为您提供附加值时使用抽象,例如当您需要它们来解决交叉问题、捕获/管理模式中重复出现的模式时,……为了抽象而创建抽象是浪费时间。我已经在这里写了很多,但为了您的利益,我将进行总结。是的,实体框架已经实现了UoW(DbContext)和Repository(DbSet)模式。重新实现它们没有任何好处。事实上,它会产生很大的不利影响,因为它大大增加了项目的维护开销。为什么Microsoft将其包含在入门教程中?老实说,我不确定,但这是一个困扰无数新MVC开发人员的错误,包括我刚开始时的情况。处于某种抽象状态是很好的,这样您的项目就不会依赖于任何一种获取数据的特定方式。但是,这种抽象应该返回您的操作所需的特定数据,不多也不少。由于找不到更好的词,我将其称为“服务”,尽管Microsoft已将SOA嫁接到该词的不同含义上。简单地说,它就像为您的应用程序创建一个API,就像创建一个WebAPI,只是完全基于代码(不需要实际的HTTP连接)。然后进入您的项目可以引用的DAL层(类库或类似层)。关于EF的事情是它公开的OUW或存储库函数中没有业务逻辑。如果您调用SaveChanges,它会很乐意保存所有更改。但是有一个要求,在添加sayWidget的时候,必须要为Widget添加Frobber,你就倒霉了(除非涉及到FK依赖)。开箱即用的EF不会强制执行任何未在数据关系中表达的业务逻辑。要强制执行此类逻辑,您必须围绕EF上下文构建一个OUW/Repository/。据我所知,这是你这样做的唯一原因。工作单元和存储库模式与实体框架的工作无关。它是设计模式之一。所以它被用来让你的代码更具可读性、可重用性和高效性,这些模式也被用来实现singelton(一次性对象实例化)和避免控制反转。以上就是《C#学习教程:EF5中的UOW和repository模式》的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。涉及侵权,请点击维权联系管理员删除。如需转载请注明出处:
