【问题标题】:Whats the best practice of linq ASP.NET MVC respository patternlinq ASP.NET MVC 存储库模式的最佳实践是什么
【发布时间】:2014-02-27 13:36:33
【问题描述】:

我是一名初级网络开发人员,每天都在努力学习更多知识。

你们用 Linq 执行 MVC 存储库模式的最佳实践是什么?

我用的那个:

使用 CRUD 方法(如 getAll()、getOne()、Update()、Delete())使用我的 .tt 文件的确切名称创建额外的类,用实体框架填充我自己的类并返回它,或者使用实体框架原油

这是我实际在做的一个例子。

这是我的类的 getAll 方法,例如 User

public class CEmployee : CResult
{

    public string name{get;set;}
    public string lastname{get;set;}
    public string address{get;set;}

    //Extracode
    public string Fullname // this code is not in the .tt or database
    {
        get
        {
            return name + lastname;
        }
    }

    public <List>CEmployee getAll()
    {
        try
            {
                var result = (from n in db.Employee 
                                select new CEmployee // this is my own class I fill it using the entity
                                {
                                    name = n.name,
                                    lastname = n.lastname,
                                    address = n.address
                                }).ToList();

                                if (result.Count > 0)
                                {
                                    return result;
                                }
                                else
                                {
                                    return new List<CResult>
                                    {
                                        new CResult
                                        {
                                            has_Error = true,
                                            msg_Error = "Element not found!!!!"
                                        }
                                    }
                                }

            }
        catch
            {
                return Exception();
            }


    }
}

我做所有事情的方式都是返回一个填充的类型,但是在网络上我看到人们通常返回实体类型,但是我这样做是为了操纵我的响应,如果我想返回额外的信息,我只需要嵌套一个列表,例如,最好的方法是什么,返回 mytype 或返回实体类型?

PD,我也像我的 ViewModel 一样使用这个类。我为我的所有类都这样做。

【问题讨论】:

  • 为什么要在这里引入异常处理?不需要。
  • 这可能是一个新手错误,但我在那里介绍它,原因如果它给我一个数据库超时怎么办。
  • 谢谢,但是你觉得用这种方法还是使用原始的 Linq 文件更好

标签: c# linq entity-framework repository


【解决方案1】:

我目前的一个项目使用依赖注入来设置 DAL(数据访问层)。我们也在使用 n 层方法;这将存储库的关注点与业务逻辑和前端分开。

因此,我们将从应用程序中相互链接的 4 个左右的基础项目开始。其中一个处理数据访问,这将是您的存储库;阅读 Ninject 以获取更多信息。我们的下一层是我们的域,它包含由 t4 模板(.tt 文件)构建的实体以及我们的 DTO(数据传输对象,它是用于在层之间移动数据的平面对象)。然后我们有一个服务层,服务层或业务逻辑层包含处理 CRUD 操作和所需的任何数据操作的服务对象。最后,我们的前端是 Model-View-ViewModel 层,负责处理控制器和页面构建。

MVVM 调用服务,服务对象调用数据访问层,Entity Framework 与 Ninject 一起访问数据,并在数据跨层移动时存储在 DTO 中。

现在这可能看起来过于复杂,具体取决于您正在编写的应用程序,这是为高度可扩展和可扩展的 Web 应用程序而构建的。

【讨论】:

    【解决方案2】:

    我强烈建议使用通用存储库实现。您的存储库和控制器之间的层取决于许多因素(这是一个更广泛/更大的主题),但通用存储库可以让您进行轻量级的良好实现。查看这篇文章以获得对该方法的详细描述:

    http://www.asp.net/mvc/tutorials/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application

    【讨论】:

      【解决方案3】:

      理想情况下,在 MVC 应用程序中,您会希望将存储库放在不同的层中,例如在单独的项目中,我们称之为数据层。

      您将拥有一个 IRepository 接口,其中包含通用方法签名,例如 GetAll、GetById、Create 或 UpdateById。您还将拥有包含共享实现的抽象 RepositoryBase 类,例如 Add、Update、Delete、GetById 等。

      您使用 IRepository 接口的原因是,您继承的存储库类(例如您的案例中的 EmployeeRepository)需要提供具体实现。抽象类用作共享实现的公共位置(并根据需要覆盖它们)。

      因此,在您的情况下,您在 DbContext 中使用 LINQ 的操作基本上是正确的,但是像 GetAll 方法这样的实现应该是抽象类 RepositoryBase 中通用/共享实现的一部分:

      public abstract class RepositoryBase<T> where T : class
      {
          private YourEntities dataContext;
          private readonly IDbSet<T> dbset;
      
          protected RepositoryBase(IDatabaseFactory databaseFactory)
          {
              DatabaseFactory = databaseFactory;
              dbset = DataContext.Set<T>();
          }
      
          protected IDatabaseFactory DatabaseFactory
          {
              get;
              private set;
          }
      
          protected YourEntities DataContext
          {
              get { return dataContext ?? (dataContext = DatabaseFactory.Get()); }
          }
          public virtual T GetById(long id)
          {
              return dbset.Find(id);
          }
          public virtual T GetById(string id)
          {
              return dbset.Find(id);
          }
          public virtual IEnumerable<T> GetAll()
          {
              return dbset.ToList();
          }
      }
      

      我建议你需要考虑是否返回像CResult这样的错误结果对象,并考虑你的CEmployee和CResult是否应该存在于这种父子关系中。还要考虑你想用你的 CResult 类做什么。在我看来,您的 CEmployee 在这种情况下处理的任务太多。

      【讨论】:

      • 我所有的类都继承自 CResult,具有结果的通知状态,在这种情况下 Msg_Error “找不到元素”,是的,我所有的类都返回一个 Msg,我用它来显示一个 msg一个模态。每次操作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-18
      • 2020-03-08
      • 2012-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多