标签: repository-pattern

存储库模式:如何延迟加载?或者,我应该拆分这个Aggregate吗?

我有一个具有编辑器和项目概念的域模型.

编辑拥有许多项目,项目不仅有编辑所有者,还有许多编辑成员.因此,编辑还有一些"加入"项目.

我正在采用DDD方法对此进行建模并使用Repository模式进行持久化.但是,我还没有足够好地确定模式,以确定我应该如何做到这一点.

我正在假设编辑器和项目可能在同一个聚合中,其中根是编辑器.因此,我可以获得一个编辑器,然后枚举其项目,并可以从那里枚举项目的成员编辑.

但是,如果我只被允许从我的存储库中检索编辑器,这是不是意味着当我获得拥有它们的编辑器时我必须从存储库加载所有项目?如果我想延迟加载成员编辑器,项目还需要对存储库的引用?

或者,如果我拆分聚合并拥有一个编辑器存储库和一个项目存储库,那么我应该如何处理两者之间的事务,例如将新项目添加到编辑器中?例如:

Editor e = new Editor("Editor Name");
editorRepository.Add(e);

Project p = e.CreateProject("Project Name");
projectRepository.Add(p);    // These two lines
editorRepository.Save(e);    // should be atomic
Run Code Online (Sandbox Code Playgroud)

我是否误解了Repository模式的意图?

domain-driven-design aggregate lazy-loading ddd-repositories repository-pattern

40
推荐指数
2
解决办法
9923
查看次数

存储库模式中的事务

如何使用存储库模式以事务方式封装多个实体的保存?例如,如果我想根据订单创建添加订单并更新客户状态,但只有在订单成功完成时才会这样做?请记住,对于此示例,订单不是客户内的集合.他们是自己的实体.

这只是一个人为的例子,所以我并不关心订单是否应该在客户对象内部,甚至不在同一个有限的上下文中.我真的不在乎将使用什么底层技术(nHibernate,EF,ADO.Net,Linq等).我只是想看看一些调用代码在这个公认的全有或全无操作示例中的样子.

design-patterns domain-driven-design architectural-patterns repository-pattern

39
推荐指数
4
解决办法
2万
查看次数

存储库模式 - 为什么我们需要接口?

我从互联网上读到了我得到了这一点,其中说接口用于此

  • 使用TDD方法
  • 替换持久性引擎

但是我无法理解接口在这一点上的用途Replace persistance engine.让我们考虑我正在创建一个基本的(没有泛型)存储库EmployeeRepository

public class EmployeeRepository
{
  public employee[] GetAll()
  {
     //here I'll return from dbContext or ObjectContex class
  }
}
Run Code Online (Sandbox Code Playgroud)

界面界面如何形成?

如果假设我创建了一个接口,为什么要使用向上转换?例如

 IEmployee emp = new EmployeeRepository() ;
 vs
 EmployeeRepository emp = new EmployeeRepository();
Run Code Online (Sandbox Code Playgroud)

请详细解释我,以及关于存储库模式的接口的其他有用性.

c# repository-pattern asp.net-mvc-3

39
推荐指数
2
解决办法
1万
查看次数

如何使用存储库模式伪造Entity Framework中的DbContext.Entry方法

因为我想对我的代码进行单元测试,所以我在MVC4应用程序中实现了存储库模式.我设法创建了一个Context Interface,一个假的Context,并System.Data.Entity.DbSet通过遵循这个代码使用a的假实现.

不幸的是,就像我面前的两张海报(这里这里),我没有设法嘲笑DbContext.Entry method.我使用此方法更新代码中的数据库条目,如下所示:

DbContext.Entry(order).State = EntityState.Modified;
Run Code Online (Sandbox Code Playgroud)

我还没有找到解决这个问题的方法,只有那些人说:

"这个代码单元测试的重点是什么?你伪造了Find方法,然后伪造DbEntityEntry并且没有真正的逻辑可以测试."

或者

在继续之前,请阅读链接和所有相关问题.(...)如果要测试存储库,请创建与真实数据库对话的集成测试.

这一切都很好,但仍然没有回答这个问题.我阅读了批评,我仍然想要这个Entry方法,所以我将能够使用假上下文并在我的单元测试中使用模拟对象.当然我也会使用集成测试,但它们并不像某些快速单元测试那么快.

我尝试一些实现时收到的错误是 Error 2 'Project.Models.Order' does not contain a definition for 'State' and no extension method 'State' accepting a first argument of type '[whatever return type I use]' could be found (are you missing a using directive or an assembly reference?)

我希望有人可以帮我制作一个假的DbContext.Entry方法.

c# unit-testing entity-framework repository-pattern asp.net-mvc-4

39
推荐指数
2
解决办法
2万
查看次数

使用Asp.Net MVC和Web Api配置Ninject

我已经设置了我的项目Ninject IoC.
我的项目有常规Asp.Net MVC控制器和Web Api控制器.现在,Ninject使用Web ApiNinject不适用于常规Asp.MVC控制器.
我的常规MVC控制器实现;

public class GalleryController : BaseController
{
    public GalleryController(IUow uow)
    {
        Uow = uow;
    }
    ........
}
Run Code Online (Sandbox Code Playgroud)

与常规控制器一起使用时出错

An error occurred when trying to create a controller of type 'Web.Controllers.HomeController'. Make sure that the controller has a parameterless public constructor.]
Run Code Online (Sandbox Code Playgroud)

但是,当我使用Web Api尝试相同的代码时,它可以工作

public class GalleryController : BaseApiController
{
    public GalleryController(IUow uow)
    {
        Uow = …
Run Code Online (Sandbox Code Playgroud)

asp.net asp.net-mvc dependency-injection ninject repository-pattern

37
推荐指数
4
解决办法
5万
查看次数

用更轻的解决方案替换完整的ORM(JPA/Hibernate):推荐的加载/保存模式?

我正在开发一个新的Java Web应用程序,我正在探索新的方法(对我来说是新的!)来保存数据.我主要有JPA和Hibernate的经验,但除了简单的情况,我认为这种完整的ORM会变得非常复杂.另外,我不喜欢和他们一起工作.我正在寻找一种新的解决方案,可能更接近SQL.

我正在调查的解决方案:

但与Hibernate相比,我有两个使用案例,我担心这些解决方案.我想知道这些用例的推荐模式是什么.


用例1 - 获取实体并访问其中一些相关的子孙实体.

  • 假设我有一个Person实体.
    • Person有一个相关的Address实体.
      • Address有一个相关的City实体.
        • City实体有一个name属性.

从人员实体开始,访问城市名称的完整路径是:

person.address.city.name
Run Code Online (Sandbox Code Playgroud)

现在,假设我PersonService使用以下方法从a加载Person实体:

public Person findPersonById(long id)
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

使用Hibernate,Person可以根据需要延迟加载与之关联的实体,因此可以访问person.address.city.name并确保我可以访问此属性(只要该链中的所有实体都不可为空).

但是使用我正在研究的3种解决方案中的任何一种,它都会更复杂.有了这些解决方案,有哪些推荐的模式来处理这个用例?在前面,我看到3种可能的模式:

  1. 可以通过所使用的SQL查询急切地加载所有必需的关联子孙实体.

    但是我在这个解决方案中看到的问题是,可能还有一些其他代码需要从实体访问其他实体/属性路径Person.例如,可能需要访问一些代码person.job.salary.currency.如果我想重用findPersonById()我已经拥有的方法,那么SQL查询将需要加载更多信息!不仅是相关address->city实体,还包括相关job->salary实体.

    现在如果还有10个其他地方需要从人员实体开始访问其他信息呢?我是否应该急切地加载所有可能需要的信息?或者可能有12种不同的服务方法来加载一个人实体?:

    findPersonById_simple(long id)
    
    findPersonById_withAdressCity(long id)
    
    findPersonById_withJob(long id)
    
    findPersonById_withAdressCityAndJob(long id)
    
    ...
    
    Run Code Online (Sandbox Code Playgroud)

    但是每当我使用一个Person实体时,我就必须知道装载它的是什么以及什么没有...它可能非常麻烦,对吧? …

java sql repository-pattern mybatis jooq

37
推荐指数
4
解决办法
2万
查看次数

实现存储库模式的最佳方式?

我一直在探索BDD/DDD,因此试图找到Repository模式的正确实现.到目前为止,很难就实现这一点的最佳方式达成共识.我试图将其归结为以下变化,但我不确定哪种方法最好.

作为参考,我正在构建一个以NHibernate作为后端的ASP.MVC应用程序.

public interface IRepository<T> {
        // 1) Thin facade over LINQ
        T GetById(int id);
        void Add(T entity);
        void Update(T entity);
        void Remove(T entity);
        IQueryable<T> Find();
        // or possibly even
        T Get(Expression<Func<T, bool>> query);
        List<T> Find(Expression<Func<T, bool>> query);
}

public interface IRepository<T> {
        // 2) Custom methods for each query
        T GetById(int id);
        void Add(T entity);
        void Update(T entity);
        void Remove(T entity);
        IList<T> FindAll();
        IList<T> FindBySku(string sku);
        IList<T> FindByName(string name);
        IList<T> FindByPrice(decimal price);
        // ... and so on
}

public …
Run Code Online (Sandbox Code Playgroud)

c# bdd domain-driven-design repository-pattern

36
推荐指数
3
解决办法
1万
查看次数

存储库模式方法的标准化

我试图找出存储库模式的正确定义.

我最初的理解是这个(非常愚蠢)

  • 将Business Objects与数据对象分开
  • 标准化数据访问层中的访问方法.

我确实看到过2种不同的实现方式,并且在网上没有正式的例子,我见过的那些都隐藏在书中.

实施1:

public Interface IRepository<T>{
      List<T> GetAll();
      void Create(T p);
      void Update(T p);
}


public interface IProductRepository: IRepository<Product> {
      //Extension methods if needed
       List<Product> GetProductsByCustomerID();
}
Run Code Online (Sandbox Code Playgroud)

实施2:

public interface IProductRepository {
      List<Product> GetAllProducts();
      void CreateProduct(Product p);
      void UpdateProduct(Product p);
      List<Product> GetProductsByCustomerID();
}
Run Code Online (Sandbox Code Playgroud)

请注意,第一个是通用Get/Update/GetAll等,第二个是我将定义的"DAO"更多.

两者都共享数据实体的提取.我喜欢哪个,但我可以用简单的DAO做同样的事情.然而,第二部分标准化我看到的访问操作的价值,如果你实现这个企业范围,人们很容易知道你的存储库的访问方法集.

我错误地认为数据访问的标准化是这种模式的一个组成部分吗?如果两者都正确,为什么选择执行2?

Rhino有一篇关于实现1的好文章,当然MS有一个模糊的定义,实现2的例子在这里.

c# design-patterns repository-pattern

36
推荐指数
2
解决办法
1万
查看次数

具有实体框架4.1和父/子关系的存储库模式

我仍然对存储库模式有些困惑.我想要使​​用此模式的主要原因是避免从域调用EF 4.1特定数据访问操作.我宁愿从IRepository接口调用泛型CRUD操作.这将使测试更容易,如果我将来必须更改数据访问框架,我将能够这样做,而无需重构大量代码.

这是我的情况的一个例子:

我在数据库中有3个表:Group,Person,和GroupPersonMap.GroupPersonMap是一个链接表,只包含主键GroupPerson主键.我用VS 2010设计器创建了3个表的EF模型.EF很聪明,可以假设它GroupPersonMap是一个链接表,因此它不会在设计器中显示它.我想使用我现有的域对象而不是EF生成的类,所以我关闭了模型的代码生成.

我与EF模型匹配的现有类如下:

public class Group
{
   public int GroupId { get; set; }
   public string Name { get; set; }

   public virtual ICollection<Person> People { get; set; }
}

public class Person
{
   public int PersonId {get; set; }
   public string FirstName { get; set; }

   public virtual ICollection<Group> Groups { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我有一个通用的存储库接口,如下所示:

public interface IRepository<T> where T: class …
Run Code Online (Sandbox Code Playgroud)

c# domain-driven-design aggregateroot repository-pattern entity-framework-4.1

35
推荐指数
1
解决办法
2万
查看次数

在实体框架中使用存储过程

我正在使用asp.net mvc 5和C#with Entity Framework ...我有函数的模型和域类...现在我需要使用存储过程....我正在努力运动.

我遵循代码第一个现有的数据库,我有存储过程写在那里.我的问题是如何在我的Web应用程序中调用该存储过程.

存储过程:

ALTER PROCEDURE [dbo].[GetFunctionByID](
    @FunctionId INT
)
AS
BEGIN
    SELECT * 
    FROM Functions As Fun
    WHERE Function_ID = @FunctionId
END
Run Code Online (Sandbox Code Playgroud)

域类:

 public class Functions
 {
    public Functions()
    {
    }

    public int Function_ID { get; set; }
    public string Title { get; set; }
    public int Hierarchy_level { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

功能模型:

[Table("Functions")]
public class App_Functions
{
    public App_Functions()
    {
    }

    [Key]
    public int Function_ID { get; set; }

    [StringLength(50)]
    [Required]
    public string …
Run Code Online (Sandbox Code Playgroud)

asp.net-mvc stored-procedures entity-framework repository-pattern

35
推荐指数
3
解决办法
11万
查看次数