[英]When using, VS2013, Entity Framework 6 and WebAPI 2, is using a generic repository and UoW framework overkill?
我正在重新审视我的通用工作单元和存储库框架的实现 。
我正在使用EF6和VS2013。 因此,VS包含WebAPI控制器模板,这些模板使用动作自动生成WebAPI 2 OData Controller,使用如下的实体框架代码:
// GET odata/UserProjects(5)/WebsiteRequiredKeywords
[Queryable]
public IQueryable<WebsiteRequiredKeyword> GetWebsiteRequiredKeywords([FromODataUri] int key)
{
return _db.Websites.Where(m => m.WebsiteId == key).SelectMany(m => m.WebsiteRequiredKeywords);
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
_db.Dispose();
}
base.Dispose(disposing);
}
private bool WebsiteExists(int key)
{ . . .
在示例代码中查看CustomerController类 - 它们对VS2013模板中自动生成的代码看起来非常熟悉。 如果我使用通用框架,我将不得不重构自动生成的代码以使用通用存储库语法,修改构造函数等。虽然我确信有一种方法可以修改模板生成过程以符合到这个通用存储库(或将我们自己的模板添加到VS模板) - 这项工作似乎是不必要的。
通用脚手架模板使用相同的数据库上下文。 据我了解,这是一个工作单元的代名词。
我现在试图找到必须执行任何这些额外工作的价值。 虽然我已经成功地使用了以前项目中的通用存储库和工作单元模式,但对于新项目来说,它只是更多的工作而不是它的价值(因为有一些概念重复b / t EF和这种模式)?
- 更新 -
通过对自动生成的代码进行一些小的修改,在实现这样的事情之后我还需要做些什么:
public class ProjectEditorController : ODataController
{
//private MyDatabaseNameContext db = new MyDatabaseNameContext(); // auto-generated code
private DbContext _db;
public ProjectEditorController(DbContext dbContext)
{
_db = dbContext;
}
. . .
这段代码的问题在于现在没有具体的上下文,并且做了类似的事情:
return SingleResult.Create(_db.Websites.Where(website => website.WebsiteId == key));
......不起作用,因为db
和实体之间没有具体的联系,即。 Websites
。
在为WebAPI控制器使用DI时 ,您仍然需要定义存储库。 这是一个案例,如果我想注入dbContext我需要使用通用仓库吗?
简而言之,这是准确的:如果您想有效地使用依赖注入,那么您需要一个通用的存储库。 否则,您需要为所有EF实体定义存储库接口,除非您使用IDependency解析程序,如本文末尾所示 。
艾恩德在这里总结得很好。 不要添加你不需要的抽象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.