c# - Akka.net/Generics and Database & Entity Framework

标签 c# akka.net

您好,我是 akka.net 的新手!所以对任何奇怪的问题表示歉意:-)

我正在研究正在访问数据库的参与者。一种是阅读,一种是写作。两者都由路由器管理,根据工作负载根据需要创建它们。

为了避免为数据库中的每种类型创建我想结合使用泛型和表达式。消息如下:

public class Msg<T> 
{
   public Expression<Func<IEnumerable<T>, T, IEnumerable<T>>> Expr { get; }

        public MsgExprObjBool (Expression<Func<IEnumerable<T>, T, IEnumerable<T>>> expr)
        {
            Expr = expr;
        }
}

在 actor 中,我想使用定义的表达式并根据请求检索实体以进行进一步处理,或者至少将它们发回 - 像这样:

public class MyActor : ReceiveActor
{
    public MyActor ()
    {
      Receive<MsgExprBool<Foo>> (s => Console.WriteLine ($"Result<Material> == {s.Expr.Compile () (_foos)}"));

      Receive<MsgExprBool<Boo>> (s => Console.WriteLine ($"Result<Boo> == {s.Expr.Compile () (_boos)}"));

      Receive<MsgExprObjBool<Qoo>> (s =>
        {
            foreach (var r in s.Expr.Compile () (_Qoos, qoo))
                Console.WriteLine ($"Result<Qoo> == {q.Id}, {q.Name}");
        });
    }
}

我现在的问题是,有没有人使用过这种方法来访问数据库?如果有,有什么经验?

快速眼动眼: 由于参与者系统与任何外部请求者通信,所有请求者都共享一组公共(public)对象定义——比如数据库对象。

最佳答案

恕我直言,我认为您的做法是完全错误的。

这意味着传递不仅不起作用的表达式,而且即使它起作用,您也会引用 actor 外部的对象/实例,这打破了 100% 的自包含规则,并且只传递不可变消息。

您不是在此处传递消息,而是在传递代码行。

您可能需要硬着头皮将您的操作包装在不可变的消息中并传递它们,以便参与者内部发生的一切都不会触及外部对象,因此能够扩展并且不会出现锁等资源问题。

关于c# - Akka.net/Generics and Database & Entity Framework,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34003643/

相关文章:

c# - 用于实现静态方法的静态字典字段

akka - 通过 AKKA 中的 worker Actor 检索国家 Actor

c# - 我需要与多个远程参与者系统进行通信

c# - 按钮没有拾取事件背后的 c# 代码,我做错了什么?

c# - 自定义 XSD 类型的 Xml 序列化

akka.net - Akka.Remote - 解除关联后无法向远程参与者发送消息

testing - 如何使用 akka.net testkit 期待一些消息并忽略其他消息?

c# - 嵌套请求的正确模式

c# - 将 Console.WriteLine 转换为文本框

c# - 如何使用 EMGU 计算 DFT 及其逆向?