gpt4 book ai didi

c# - 什么是 IRepository 以及它的用途是什么?

转载 作者:IT王子 更新时间:2023-10-29 04:02:17 26 4
gpt4 key购买 nike

什么是 IRepository?为什么使用它,简短的例子不会有什么坏处。

最佳答案

MVC 促进关注点分离,但这并不止于 MVC 级别。

数据访问本身就是一个问题。应该是在MVC的M位,即模型中完成。如何构建模型取决于您,但人们通常会遵循久经考验的模式(为什么要重新发明轮子?)。存储库模式是当前的标准。但是,不要指望一个简单的公式,因为几乎有多少开发人员就有多少变化。

IRepository 只是您创建的一个接口(interface)(它不是 MVC 或 ASP.NET 或 .NET 的一部分)。它允许您将存储库与实际实现“分离”。解耦很好,因为这意味着你的代码......:

  1. 您的代码可重用性更高。这简直太好了。
  2. 您的代码可以使用控制反转(或依赖注入(inject))。这有助于将您的关注点分开。它特别好,因为它允许单元测试...
  3. 您的代码可以进行单元测试。这在具有复杂算法的大型项目中尤其有用。它无处不在,因为它可以加深您对正在使用的技术以及您尝试在软件中建模的领域的理解。
  4. 您的代码将围绕最佳实践构建,遵循通用模式。这很好,因为它使维护更容易。

所以,在向您推销解耦之后,您的问题的答案是 IRepository 是您创建的接口(interface),您可以从中继承 Repositories。它为您提供了可靠的类层次结构。

我通常使用通用的 IRepository:

IRepository

TEntity 是一个实体。我使用的代码是:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Wingspan.Web.Mvc
{
public interface IRepository<TEntity> where TEntity : class
{
List<TEntity> FetchAll();
IQueryable<TEntity> Query {get;}
void Add(TEntity entity);
void Delete(TEntity entity);
void Save();
}
}

这个接口(interface)的具体实现是:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;

using Wingspan.Web.Mvc;

namespace ES.eLearning.Domain
{
public class SqlRepository<T> : IRepository<T> where T : class
{
DataContext db;
public SqlRepository(DataContext db)
{
this.db = db;
}

#region IRepository<T> Members

public IQueryable<T> Query
{
get { return db.GetTable<T>(); }
}

public List<T> FetchAll()
{
return Query.ToList();
}

public void Add(T entity)
{
db.GetTable<T>().InsertOnSubmit(entity);
}

public void Delete(T entity)
{
db.GetTable<T>().DeleteOnSubmit(entity);
}

public void Save()
{
db.SubmitChanges();
}

#endregion
}
}

这让我可以写:

SqlRepository<UserCourse> UserCoursesRepository = new SqlRepository<UserCourse>(db);

其中 db 是注入(inject)到服务中的 DataContext 实例。

有了 UserCoursesRepository,我现在可以在我的服务类中编写方法,例如:

public void DeleteUserCourse(int courseId)
{
var uc = (UserCoursesRepository.Query.Where(x => x.IdUser == UserId && x.IdCourse == courseId)).Single();
UserCoursesRepository.Delete(uc);
UserCoursesRepository.Save();
}

现在在我的 Controller 中,我可以写:

MyService.DeleteUserCourse(5);
MyService.Save();

通过这种模式,您的应用程序开发更像是一条流水线,最终形成一个非常简单的 Controller 。装配线的每一部分都可以独立于其他所有部分进行测试,因此可以将错误消灭在萌芽状态。

如果这是一个长而笨拙的答案,那是因为真正的答案是:

购买Steven Sanderson's book Pro ASP.NET MVC 2 Framework并学会在 MVC 中思考。

关于c# - 什么是 IRepository 以及它的用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4528712/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com