c# - 什么是标准的 Akka.Net 消息命令验证模式?

标签 c# asp.net validation generics akka.net

我们的许多消息在被安全处理之前需要进行验证。检查输入,有时应用复杂的业务规则。

在 Akka 之前的设计中,我会有一个 ICommandValidator<T>使用单一方法 IsValid和错误的属性。因此,具体的验证器会告诉您消息是否有效,如果无效,您可以阅读错误。

在 Akka.Net 中,我开始为每条消息编写具体的验证器角色(显然创建更多角色是好的)——例如,CreateTenantCommand 由 TenantCreatorActor(继承自 ReceiveActor)发送到 CreateTenantCommandValidatorActor 以进行验证。如果它是有效的,一条 CreateTenantCommandValidated 消息(基本上是包装的原始消息)被发送到 TenantCreateActor,它解包消息,然后处理消息。

我想知道我是否应该存储一个未验证消息的列表以及需要验证它们的参与者,然后将这些消息与验证响应相关联,或者我应该发送整个消息来回验证吗?验证者需要验证整个消息,但是我不确定在请求者上保持消息完整并仅确认其有效性的好处?

在 Akka.Net 消息和 Actors 中使用泛型是否很常见?这似乎是一个包含大量样板的区域,但我从未在任何示例中真正看到太多泛型,这让我很担心。我的设计看起来像:

public class IsValidCommand<TCommamd>{

    public TCommamd Command { get; private set; }
    Ctor....
}
public class ValidCommand<TCommamd>
{
    public TCommamd Command { get; private set; }
    Ctor....
}
public class InvalidCommand<TCommamd>
{
    public TCommamd Command { get; private set; }
    public List<string> Errors { get; private set; }
    Ctor....
}    

另一种方法是创建一个组合 ValidatedCommand<T>

public class ValidatedCommand<T>
{
    public T Command { get; set; }
    public IEnumerable<string> Errors { get; }
    public bool IsValid => !Errors.Any();

    Ctor...
}

然后我可以创建一个通用的 ValidatorActor 并向其中注入(inject)一个验证器类。例如。

var createValidatorProps = Props.Create(() => new ValidatorActor<CreateInstanceCommand>(Self, new CreateInstanceCommandValidator()));
CreateInstanceCommandValidatorActor = Context.ActorOf(createValidatorProps, "CreateInstanceCommandValidatorActor");

像这样的通用验证器参与者:

public class ValidatorActor<T> : ReceiveActor{
    public IActorRef Requestor { get; }
    public ValidatorActor(IActorRef requestor, ICommandValidator<T> validator)
    {
        Requestor = requestor;
        Receive<IsValidCommand<T>>(
            commandWrapper =>
                {
                    var command = commandWrapper.Command;
                    if (validator.Validate(command))
                    {
                        requestor.Tell(new ValidCommand<T>(command));
                    }
                    else
                    {
                        requestor.Tell(new InvalidCommand<T>(command));
                    }
                });
    }
}

可能应该注意我意识到它可能应该是 ValidateAsync然后 PipeTo所以 Actor 不会阻止。所以这可能需要 ValidatedCommand<T>从 ValidateAsync 方法返回的方法

这意味着这些消息可以标准化。这是在 Akka.Net 中处理消息验证的合适方法,还是我弄错了?

最佳答案

我的话不是福音,我只是另一个黑客,在黑客攻击中给出我的黑客观点供权威人士攻击。

重新传递信息。理想情况下,您希望一切都小。但事情也不会在您不需要担心的本地系统上得到序列化(对此我有 99.9% 的把握)。在远程处理边界上,我认为您有一个合理的担忧。

然而,这是一个过早的优化问题吗?以一种方式进行,如果它是一个问题,那么分析它然后再决定。

关于泛型,是的,我发现了一些非常好的用途。常见的,不是真的。但是当它工作并且是正确的地方时,它是优雅的 imo。当我发现它有效时,我真的很兴奋。

但这可能还不够。

已经使用类似的模式来观察回调,但也用于验证,以及当我想编写像 actor 这样的真正通用代理(例如保证消息传递)时

关于c# - 什么是标准的 Akka.Net 消息命令验证模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32683247/

相关文章:

c# - 如果没有父节点,如何删除节点

c# - 限制 asp.net mvc 应用程序中的功能?

asp.net - ASP.NET MVC 3 Helpers 中的 Tab 键顺序

java - 发生 jsf 验证错误时执行操作

html - 为什么没有 dt 标签的 dl 标签会生效

hibernate - 扩展@NotEmpty 以接受其他类

c# - 在 session 中添加两个数字

c# - 如何使用python .Net与ZeroMQ或其他将Python包公开给C#

c# - 控件布局模板

c# - 将 id 值传递给 gridview 控件中的 LinkBut​​ton 服务器端事件