什么是linq ASP.NET MVC存储库模式的最佳实践

时间:2014-02-27 03:34:38

标签: c# linq entity-framework repository

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

使用Linq执行MVC存储库模式的最佳做法是什么?

我使用的那个:

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

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

这是我的类的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一样使用这个类。我为我的所有类都这样做。

3 个答案:

答案 0 :(得分:1)

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

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

MVVM调用服务,服务对象调用数据访问层,实体框架与Ninject一起访问数据,当数据在层间移动时,数据存储在DTO中。

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

理想情况下,在MVC应用程序中,您需要将存储库放在不同的层中,就像在单独的项目中一样,我们将其称为数据层。

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

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

因此,在您的情况下,使用LINQ和DbContext进行的操作基本上是正确的,但是像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 Class做什么。在我看来,你的CEmployee在这种情况下处理太多任务。