我想知道我应该如何对我的存储库进行分组?就像我在asp上看到的例子一样.net mvc,在我的书中,基本上每个数据库表使用一个存储库.但似乎有很多存储库导致你以后不得不调用许多存储库来进行模拟和其他操作.

所以我猜我应该把他们分组.然而,我不知道如何将它们分组.

现在我建立了一个注册库来处理我所有的注册信息.然而,在我有3个存储库之前,我需要更新4个表.

例如,其中一个表是许可证表.当他们注册时,我查看他们的密钥并判断它是否存在于数据库中.现在,如果我需要在注册之外的其他地方判断这个许可证密钥或该表中的其他内容,会发生什么?

一个Spot可以是登录(判断密钥是否过期).

那么在这种情况下我该怎么办?再次重写代码(断章取义)?try 将这两个存储库合并在一起,并希望在其他时间点不需要任何方法(比如,也许我可能有一个方法可以判断是否使用了用户名——也许我会在其他地方需要它).

此外,如果我将它们合并在一起,我可能需要两个服务层进入同一个存储库,因为我认为一个站点的两个不同部分的所有逻辑都很长,而且我必须有ValidateLogin()、ValdiateRegistrationForm()、ValdiateLoginRetrievePassword()等名称.

或者打电话给存储库,只是有个奇怪的名字?

似乎很难让存储库具有足够通用的名称,这样您就可以在应用程序的许多位置使用它,并且仍然有意义,而且我认为在存储库中调用另一个存储库不是一个好做法?

推荐答案

在使用存储库模式时,我做错了一件事-就像您一样,我认为该表与存储库1:1相关.当我们应用领域驱动设计中的一些规则时,存储库分组问题通常会消失.

存储库应为每Aggregate root个,而不是表.这意味着——如果实体不应该单独存在(即——如果你有一个Registrant参与了特定的Registration)——它只是一个实体,不需要存储库,应该通过它所属的聚合根存储库进行更新/创建/检索.

当然,在很多情况下,这种减少存储库数量的技术(实际上,它更像是一种构造域模型的技术)无法应用,因 for each 实体都应该是聚合根(这在很大程度上取决于您的域,我只能提供盲猜).在您的示例中,-License似乎是一个聚合根,因为您需要能够在没有Registration实体上下文的情况下判断它们.

但这并不限制我们级联存储库(如果需要,Registration个存储库可以引用License个存储库).这并不限制我们直接从Registration对象引用License存储库(最好是通过IoC).

尽量不要通过技术提供的复杂性或误解来推动您的设计.仅仅因为您不想构建2个存储库就将存储库分组为ServiceX个存储库不是一个好主意.

最好给它取一个合适的名字——RegistrationService,即.

但一般来说,应该避免使用服务——它们往往是导致anemic domain model人死亡的原因.

EDIT:
一定要开始使用IOC.它真正减轻了注入依赖项的痛苦.
与其写下这句话,不如说:

var registrationService = new RegistrationService(new RegistrationRepository(),  
      new LicenseRepository(), new GodOnlyKnowsWhatElseThatServiceNeeds());

你将能够写:

var registrationService = IoC.Resolve<IRegistrationService>();

P.s.最好使用所谓的common service locator,但这只是一个例子.

Asp.net相关问答推荐

如何处理当前文件中基本文件中的S onClick方法

我可以在一个 Web 项目中有多个 web.config 文件吗?

Dotnet core 2.0 身份验证多模式身份 cookie 和 jwt

SignalR 不在服务器上使用 Session

未知的网络方法.参数名称:methodName

从 RowDataBound 事件的 gridview 从单元格中获取值

ASP.NET Core 中的授权. [Authorize] 属性总是 401 Unauthorized

HTTP 错误 401.3 - 未经授权

如何在 ASP.NET 下拉列表中添加选项组?

VirtualPath 在当前应用程序根目录之外

如何在新选项卡中打开 asp:HyperLink.NavigateUrl

以编程方式从后面的代码中关闭 aspx 页面

如何在 asp net core api 中使用 Created(或 CreatedAtAction / CreatedAtRoute)

您使用哪个 .NET Memcached 客户端,EnyimMemcached 与 BeITMemcached?

VS2017 无法加载文件或程序集 Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll 或其依赖项之一

MVC3 值 Ajax 文件上传

如何获取程序集的最后修改日期?

路由模板分隔符/不能连续出现 - 属性路由问题

将对象传递给 HTML 属性

您的下一个 ASP.NET 项目的 Select 是什么:Web 窗体还是 MVC?