- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
什么是 IRepository?为什么使用它,简短的例子不会有什么坏处。
最佳答案
MVC 促进关注点分离,但这并不止于 MVC 级别。
数据访问本身就是一个问题。应该是在MVC的M位,即模型中完成。如何构建模型取决于您,但人们通常会遵循久经考验的模式(为什么要重新发明轮子?)。存储库模式是当前的标准。但是,不要指望一个简单的公式,因为几乎有多少开发人员就有多少变化。
IRepository 只是您创建的一个接口(interface)(它不是 MVC 或 ASP.NET 或 .NET 的一部分)。它允许您将存储库与实际实现“分离”。解耦很好,因为这意味着你的代码......:
所以,在向您推销解耦之后,您的问题的答案是 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/
我见过两种不同的创建通用存储库的方法。这两种方法(优点和缺点)之间有什么区别?请忽略方法上的差异,因为我对 之间的差异感兴趣 public interface IRepository where T
我正在为我的 mvc web 应用程序寻找一个简单的 IRepository 接口(interface),我在周围做了很多搜索,有多少人就有多少意见。所以我决定请教专家 如果能推荐一个常用的IRepo
我试图从基础开始,但无法理解如何创建此最小起订量对象。 public class TestRefMedicalSpecialty { private Mock> mockRefMedical
我已经为多个域实现了 IRepository 接口(interface),但我不知道如何调用具体方法。 代码如下: public interface IRepository where T : cla
我知道有一个 Unit Of Work 是在抽象之上有一个抽象 (DbContext),这肯定是一种反模式,或者至少不是必要的。 我有以下问题: 我有一个像这样的通用 IRepository: pub
我希望在一个小项目中使用 IRepository 模式(由 NHibernate 支持,如果它重要的话)。域是一个简单的域,有意让我专注于理解 IRepository 模式。单独的域类是 Movie,
我想知道使用 IRepository 模式处理关系数据的推荐方法是什么。 我的数据库有下表,列名在括号中: 计划(PlanId、名称、创建日期、修改日期、ViewId) 区域(AreaId、名称、nT
我正在设计我的 ASP.NET MVC 应用程序,我遇到了一些有趣的想法。 我见过的许多示例都描述和使用了存储库模式 ( IRepository ),所以这就是我在学习 MVC 时所做的方式。 现在我
当实际加载数据时,我对使用“IRepository 模式”时感到有些困惑。 目前我有这样的事情: public class MainViewModel : ViewModelBase { //
我使用提到的存储库编写了以下方法在以下博客文章 (http://www.codecapers.com/post/Using-RavenDB-with-ASPNET-MVC.aspx) 中使用 Rave
我是 Repository 概念的新手,遇到了一些问题。我在我的 MVC 应用程序中创建了简单的存储库类。 public interface IRepository where TEntity
我想模拟一个内部存储库的工作单元接口(interface),用于单元测试目的。到目前为止,我可以像下面那样做。 namespace Liquid.Service.UnitTest { usin
什么是 IRepository?为什么使用它,简短的例子不会有什么坏处。 最佳答案 MVC 促进关注点分离,但这并不止于 MVC 级别。 数据访问本身就是一个问题。应该是在MVC的M位,即模型中完成。
可以说我的 IService 拥有 IRepository 拥有的一切,而且还有一些特定的操作吗? 代码如下: public interface IRepository { T Add(T E
我已经实现了存储库模式并且效果很好。 public interface IServiceRepository { User GetUser(int id); User GetUser(
我正在使用通用存储库接口(interface),它允许我添加、查找、更新和删除不同类型的对象。然后我实现了两个具体的存储库,并且可以在不更改应用程序的情况下切换它们。一切都奇妙地脱节。但我遇到了一个障
我一直在尝试想出一种方法来编写适用于各种数据存储的通用存储库: public interface IRepository { IQueryable GetAll(); void Sav
在典型的三层系统中,GUI->DOMAIN->DAL,IRepository 属于哪里?它属于 DOMAIN 还是 DAL。我对正交性和服务层了解不够,不知道有什么区别。(编辑)请允许我澄清一下。 I
我有以下项目布局: MVC UI |...CustomerController (ICustomerRepository - how do I instantiate this?) Data Mode
在 Orchard CMS 中使用 IRepository<>很常见。 所以我问自己,使用 IRepository<> 有什么好处?及其 Fetch()方法而不是简单地使用 Linq to SQL查询
我是一名优秀的程序员,十分优秀!