我是一名初级网络开发人员,每天都在努力学习。
使用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一样使用这个类。我为我的所有类都这样做。
答案 0 :(得分:1)
我目前的一个项目是使用依赖注入来设置DAL(数据访问层)。我们也使用n层方法;这将存储库的关注与业务逻辑和前端区分开来。
因此,我们将从应用程序中相互链接的4个左右基础项目开始。其中一个处理数据访问,这将是您的存储库;阅读Ninject了解更多信息。我们的下一层是我们的域,其中包含由t4模板(.tt文件)构建的实体以及我们的DTO(数据传输对象,它们是用于在层之间移动数据的平面对象。)然后我们有一个服务层,服务层或业务逻辑层包含处理CRUD操作和所需的任何数据操作的服务对象。最后,我们的前端是Model-View-ViewModel层,处理控制器和页面构建。
MVVM调用服务,服务对象调用数据访问层,实体框架与Ninject一起访问数据,当数据在层间移动时,数据存储在DTO中。
现在这可能看起来过于复杂,具体取决于您正在编写的应用程序,这是为高度可扩展和可扩展的Web应用程序而构建的。
答案 1 :(得分:0)
我强烈建议使用通用存储库实现。存储库和控制器之间的层数取决于许多因素(这是一个更广泛/更大的主题),但通用存储库可以让您进行轻量级的良好实现。查看本文以获得该方法的详细描述:
答案 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在这种情况下处理太多任务。