Akka.net / 泛型和数据库 & Entity Framework

Akka.net / Generics and Database & Entity Framework

大家好,我是 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}");
        });
    }
}

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

快速眼动: 由于 actor 系统 NOT 与任何外部请求者通信都共享一组公共对象定义 - 就像数据库对象一样。

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

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

您在这里传递的不是消息,而是代码行。

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