2014-02-27 69 views
2

我是一个初级Web开发人员,每天都在努力学习更多东西。linq ASP.NET MVC仓库模式的最佳实践是什么

你们用Linq来实现MVC存储库模式的最佳做法是什么?

我使用的一个:

与我有类似GETALL(),getOne(),更新(CRUD方法.TT文件的确切名称创建额外的clases),删除()填充我自己的类与实体框架,并返回这个,或使用实体框架原油

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

这是我班的例如用户

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(); 
      } 


    } 
} 

我GETALL的方法,我做的所有事情,我返回一个充满我喜欢的类型,但在网络上我看到的方式,人们normaly返回实体类型,但我这样做是为了操纵我的回应,如果我想返回额外的信息,我只需要列出一个例子,最好的方法是什么,返回mytype或返回实体类型?

PD,我也使用这个类像我ViewModel.And我这样做是为我所有的课程。

+0

你为什么要在这里引入异常处理?这不是必需的。 – JonH

+0

这可能是一个新手的错误,但我在那里介绍它,导致如果它抛出数据库超时。 – user1431866

+1

您正在吞咽确切的异常并抛出一个新的空异常,销毁有关实际出错的任何数据(消息,堆栈跟踪)。如果你不打算做一些有用的事情,肯定会删除try/catch块。 –

回答

1

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

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

的MVVM调用服务,服务对象调用数据访问层和Entity Framework可与Ninject访问数据和存储在DTO,因为它是跨层移动的。

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

0

理想的MVC应用程序,你会想在仓库就像一个单独的项目,不同的层,我们称之为数据层。

您将拥有包含了通用的方法签名一样GETALL,GetById,创建或UpdateById的IRepository接口。您还将拥有包含共享实现的抽象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类来做什么。在我看来,CEmployee在这种情况下处理了太多的任务。

+0

所有我的类继承自CResult,并具有通知状态的结果,在这种情况下,Msg_Error“Element not found”,是所有我的关卡返回一个消息,我用这个来显示一个消息。在每个操作上。 – user1431866