ASP.NET MVC,EntityFramework,DBContext,不同项目中的存储库[关闭]
Posted
技术标签:
【中文标题】ASP.NET MVC,EntityFramework,DBContext,不同项目中的存储库[关闭]【英文标题】:ASP.NET MVC, EntityFramework, DBContext, Repository in a different Project [closed] 【发布时间】:2013-11-07 10:18:08 【问题描述】:我目前正在开发一个 ASP.NET MVC 5 项目,我正在尝试完善该项目的架构;尽可能让人们在未来的工作中保持干净和容易。
对于初学者,我已将我的 EntityFramework 模型(包括 IdentityUser 和 AccountViewModel)移动到同一解决方案中的类库项目中。这是目前主要的 MVC 项目引用的。
但是,我现在正在考虑创建一个新的数据访问层项目,该项目将保存 DbContext(或 DbContext,如果我决定使用多个 DbContext)以及数据访问层。继续这样做的最佳方法是什么?
此 DAL 项目将引用 Model 项目,而主 MVC 项目将仅引用 DAL 项目。
看完this article!我想知道在使用 EntityFramework 时,存储库模式是否确实已经过时了。
所以我的两个主要问题是:
1) 将 DAL 提取到单独项目中的最佳方法是什么
2) 使用 EF 访问数据库内容的最佳方式是什么
【问题讨论】:
域模型!= 查看模型。所以AccountViewModel
不应该是实体模型。或者,至少,它不应该有那个名字。
确实!我只是说我已经将所有内容从 MVC 项目中的模型文件夹移动到模型项目(ASp.NET MVC 默认将 AccountViewModel 放在模型文件夹中)。我还计划将域模型移动到不同的项目。我很乐意听取任何建议!
要使用外部存储库,您应该添加对托管该存储库的项目的引用!然后你需要使用 YourProject.Models 等。 PS:YourProject 应该(大部分时间)是一个类库项目!
【参考方案1】:
您的问题非常广泛。例如,“使用 EF 访问数据库内容的最佳方式”是什么意思?性能方面的最佳方式?
我将尝试通过给出一个我更喜欢的选项来回答(我主要使用一些变体),它使用存储库模式。如果您将 EF 集直接用作存储库,您可能会争辩说您不需要存储库模式,但我喜欢将它们包装在我自己的一个中。
由于我不知道您所说的最佳方式是什么意思,我将给出适合典型 Web 项目的个人偏好。
我不会发布所有代码以使其完全正常运行,但您应该清楚知道发生了什么。
设置(4 个项目):
UI ----------> Domain.Logic (w. Domain.Models) -----> 数据(保存 EF 上下文) .
数据:
public partial class EFContextContainer : DbContext
enter code here
public EFContextContainer ()
: base("name=EFContextContainer")
public DbSet<IdentityUser> IdentityUsers get;set;
使用返回上下文的包装器:
public static class Database
public static EFContextContainerGetContext()
return new EFContextContainer();
您可以有这样的存储库设置:
界面:
public interface IRepository<T> where T : class
IQueryable<T> GetAll();
T GetById(Guid id);
void Add(T entity);
void Update(T entity);
void Delete(T entity);
void Delete(Guid id);
实现(为简洁起见仅实现了 Add(T entity)):
public class EFRepository<T> : IRepository<T>, IDisposable where T : class
public EFRepository(DbContext dbContext)
if (dbContext == null)
throw new ArgumentNullException("dbContext");
DbContext = dbContext;
DbSet = DbContext.Set<T>();
protected DbContext DbContext get; set;
protected DbSet<T> DbSet get; set;
public virtual void Add(T entity)
DbEntityEntry dbEntityEntry = DbContext.Entry(entity);
if (dbEntityEntry.State != EntityState.Detached)
dbEntityEntry.State = EntityState.Added;
else
DbSet.Add(entity);
public void Dispose()
DbContext.Dispose();
域:
Domain.Logic(IdentityUserManager 将是 Domain.Models 中的一个类):
public class IdentityUserManager
public void Add(IdentityUser idUser)
using(var idUserRepository = new EFRepository<IdentityUser>(Database.GetContext())
idUserRepository.Add(idUser);
用户界面:
[HttpPost]
public ActionResult Post(UserViewModel model)
UserIdentity user = MapUser(model);
var userManager = new IdentityUserManager();
userManager.Add(user);
return View(new UserViewModel());
(这不是全部在 Visual Studio 中编写的,所以请原谅任何拼写错误。)
承认,这段代码中可以有更多的抽象,但在这里写下整个解决方案是很荒谬的。例如,您也可以使用Unit of Work 模式,它非常适合存储库模式。因此,请阅读此示例,而不是有关如何实施此设置的完整指南。事情可以比这个例子更简洁。
要深入了解其中一些模式的实现,我敦促您可以查看 John Papa 的 Plural Sight 课程 Single Page Apps。他出色地解释了这些模式的好处以及如何实现它们。
【讨论】:
感谢@bump!我的意思是使用存储库模式是否值得?不是吗?如果是这样,您将如何继续在一个单独的项目中实现它。我有点困惑每个“层”是如何粘合在一起的,而且我还没有找到任何教程(针对 ASP.NET MVC)来用代码示例解释这一点。我得到以下内容: WebApp.Model(它包含所有 POCO 类) WebApp.ViewModel(它包含视图模型,具有数据属性) WebApp.Controllers WebApp.Views 逻辑在哪里?即 GetAllUsers() id 喜欢关于 ASP.NET MVC 分层/关注点分离的教程 @teh0wner 我的示例使用不同的项目(存储库位于数据层中)。在我看来,绝对值得使用存储库。 John Papa 提到的课程是使用 MVC 分离关注点的优秀教程(您可以免费试用 PluralSight)。所以检查一下。 看过教程,必须承认它非常棒。不过有一个问题.. IdentityUser 会去哪里?因为它需要引用 EntityFramework,所以它实际上不是 POCO 类。 @teh0wner 为什么不呢?您可以将 POCO 用作 Code First Entity 模型。你可以用属性和一切来装饰它们。以上是关于ASP.NET MVC,EntityFramework,DBContext,不同项目中的存储库[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
七天学会ASP.NET MVC ——ASP.NET MVC 数据传递
ASP.NET MVC 5、ASP.NET Core MVC 5 有啥区别?