我正在开发一个系统,在该系统上我希望尽可能地将各层分离,某种模块化的应用程序可以在不认真修改系统其余部分的情况下切换数据库和其他内容。

因此,我一直在看x-这段时间,这是罗伯特·C·马丁(Robert C. Martin)关于良好实践,简洁代码,去耦架构等的演讲之一,以期获得一些启发。我觉得有点怪异的是他对系统Fitnesse的描述以及它们实现WikiPage的存储/加载方法的方式。我也在链接视频:Robert C. Martin - Clean Architecture and Design

他所描述的(至少根据我的理解)是该实体知道该机制如何从某个持久层存储和加载自身。当他想将WikiPages存储在内存中时,他只是覆盖了WikiPage并创建了一个新的InMemoryWikiPage。当他想将它们存储在数据库中时,他做了同样的事情……

因此,我的问题之一是-这种方法叫什么? 我一直在学习有关存储库模式和东西的东西,为什么应该像这样的类对持久性一无所知,但是我似乎找不到关于他所做的事情的任何 Material 。因为我的应用程序将由模块组成,所以我认为这可能有助于解决我的问题,而无需为我的实体创建一些集中式存储...每个模块都将简单地照顾好自己,包括其实体的持久性。

我认为代码看起来像这样:

public class Person : IEntity
{
   public int ID { get;set; }
   public string Name { get;set; }

   public void Save()
   {
       ..
   }

   public void Update()
   {
   }

   public void Delete()
   {
   }

   ...
}

似乎有点不可思议,但是...或者也许我误解了他在视频中所说的话?

我的第二个问题是,如果您不同意这种方法,在这种模块化应用程序中将采取什么路径?

如果可能,请提供示例并提供一些解释。

最佳答案

您发布的模式是Active Record

存储库和事件记录模式之间的区别在于,在事件记录模式中,数据查询和持久性与域对象在一个类中,而在存储库中,数据持久性和查询与域对象本身是分离的。

您可能要研究的另一种模式是查询对象,与存储库模式不同,在每个可能的查询(过滤,排序,分组等)中,方法的数量都会增加,查询对象可以使用流利的接口(interface)来表达[1]或专用,您可以在其中传递参数[2]

最后,您可能会在Command Query Responsibility Segregation体系结构中找到想法。我个人松散地遵循了它,只是提出了可以帮助我的想法。

希望这可以帮助。

根据评论更新

存储库模式的一种变化是

UserRepository
{
    IEnumerable<User> GetAllUsers()
    IEnumerable<User> GetAllByStatus(Status status)
    User GetUserById(int id)
    ...
}

这不会扩展,因为存储库已更新,可以请求其他查询

另一个变化是将query object作为参数传递给数据查询
UserRepository
{
    IEnumerable<User> GetAll(QueryObject)
    User GetUserById(int id)
    ...
}


var query = new UserQueryObject(status: Status.Single)
var singleUsers = userRepo.GetAll(query)

在.Net世界中,传递Linq表达式而不是QueryObject
var singleUsers = userRepo.GetAll(user => user.Status == Status.Single)

另一种变化是通过实体的唯一标识符将存储库专用于在一个实体上进行检索并保存,而查询对象用于提交数据检索,就像在CQRS中一样。

更新2

我建议您熟悉SOLID principles。这些原则对于指导您创建松散耦合,高凝聚力的体系结构非常有帮助。

Los Techies compilation on SOLID pricples包含有关SOLID原理的良好介绍性文章。

关于c# - 解耦架构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15969293/

10-13 06:08