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有啥区别?

七天学会ASP.NET MVC ——ASP.NET MVC 数据传递

ASP.NET MVC

ASP.NET MVC 5、ASP.NET Core MVC 5 有啥区别?

ASP.NET MVC 和 Angularjs 与 ASP.NET MVC 和 Reactjs

七天学会ASP.NET MVC ——ASP.Net MVC 数据处理