gpt4 book ai didi

c# - 如何在我的业务逻辑层中管理统一性?

转载 作者:行者123 更新时间:2023-11-30 12:38:08 25 4
gpt4 key购买 nike

在aspnetcore mvc执行上下文中。

我有这个简单的实体。

public class Foo
{
public int Id { get; private set; }
public string Name{ get; private set; }
public string Code { get; private set; }

private Foo() { }

public Foo(string Name, string Code)
{
GuardClauses.IsNullOrWhiteSpace(Name,nameof(Name), "cannot be null or empty");
GuardClauses.IsNullOrWhiteSpace(Code, nameof(Code), "cannot be null or empty");
this.Nom = Nom;
this.Code = Code;
}
}


在我的DbContext中,我具有此代码字段/约束,可从持久性的角度确保代码是唯一的。

protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<Foo>()
.HasIndex(u => u.Code)
.IsUnique();
}


我希望服务类中的addNewFoo方法在添加它之前确保对应用程序中的所有Foos属性代码都是唯一的。

我尽我所能遵守持久性无知原则,但是我不如我希望的那样熟练。

对于初学者来说,确定代码字段是否唯一的是Builder的角色吗?

其次,我知道在验证层中,我可以确定是否已经存在一个具有与我当前尝试添加的实际foo相同的代码的foo。但是这种方法不是线程安全的或事务性的。

事实是我不想等到我添加foo时也有SqlException,只是知道它无法完成。

什么是最好的方法来确保我的应用程序与
牢记快速失败原则。

最佳答案

因为没有系统的具体示例或描述,所以我将进行概括。如果您提供具体示例,则可以添加其他信息。每个解决方案都有一个最适用的上下文,当然总会有一个折衷方案

让我们问几个有关本《守则》的性质及其代表什么的疑问


谁负责代码生成:系统用户还是系统本身?
代码可以完全随机(例如UUID)吗?
是由某些特殊算法(SSN或由具有特殊含义的不同部分组成的CarPartNumber)生成的代码吗?


还有一个非常重要的问题:


我们预计这些独特的违规行为会多久发生一次?


如果问题2的答案是“是”,那么您就没有问题。您可以有一个重复的UUID,但是机会很少。您可以为数据库添加一个唯一约束,以防万一,并将此违规视为您不关心的普通错误,因为它在一百万年后会发生一次。

如果问题3的答案是“是”,那么我们的情况就不同了。在多用户系统中,您无法避免并发。有两种处理场景的方法:


选项1:Optimistic Offline Lock
选项2:Pessimistic Offline Lock
选项3:如果系统正在生成代码,则具有特殊服务和队列代码生成请求。


如果选择使用锁定,则可以锁定整个资源Foo或仅锁定代码生成。

选项1:

您将必须处理SQLException。如今,该应用程序已在大多数应用程序中使用,因为它可确保不会因有人锁定资源而导致应用程序停滞大量时间,从而确保流畅的用户体验。

您可以使用抽象,例如存储库。定义您自己的应用程序级别的异常UniqueCodeViolationException,该异常将由存储库引发。当比较错误代码时,存储库将尝试{} catch {} SQLException,对其进行处理并将其包装在UniqueCodeViolationException中。这不会为您节省检查,但至少会隐藏具体错误,并且只在一个地方进行处理。

选项2:

有时您确实需要确保没有并发,因此您使用此选项。在这种情况下,您将只能锁定一个用户的Foo创建过程,并且如果存在锁定,则不允许其他用户打开创建Foo的对话框/表单/页面。

通过创建一个基本上对于面向同一Foo的多个用户不可用的系统,这可以确保一致性并避免该问题。您正在构建的应用程序很可能只有一个人负责Foo创建,或者并发性很低,因此这可能是一个很好的解决方案。

我有一些在保险应用程序中使用此锁的朋友。通常,在他们的申请中,一个人要去一个办公室进行保险。因此,为同一人创建保险的并发可能性非常低,但是为同一人购买多个保险的成本却很高。

选项3:

另一方面,如果您的代码是由系统生成的,则可以拥有一个CodeGenerationService来处理代码生成并确保生成唯一的代码。您可以将这些请求放在队列中。在服务中的每个生成操作中,您可以检查此代码是否存在并返回错误(或引发异常)。

现在问题4。如果您不希望经常发生冲突,只需在数据库中添加唯一约束并将其视为一般的意外错误即可。添加检查代码是否已经存在,如果存在则显示错误。

您仍然可以在此处进行并发操作,因此将有一个微小的变化,即一个用户将添加一个Foo,而另一个用户将收到错误消息“糟糕……有些错误,请重试”。因为这将在100年内发生一次,所以可以。

最后一种解决方案将忽略罕见情况下可能发生的特殊情况,从而使您的系统更加简单。

关于c# - 如何在我的业务逻辑层中管理统一性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55629719/

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