3

嗨,我对 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;
        }
}

在演员中,我想使用定义的表达式并根据请求检索实体以进行进一步处理或至少将它们发回 - 如下所示:

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}");
        });
    }
}

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

REM:由于参与者系统与任何外部请求者进行通信,所有请求者都共享一组公共对象定义 - 就像数据库对象一样。

4

1 回答 1

1

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

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

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

您可能需要咬紧牙关,将您的操作包装在不可变消息中并传递这些消息,以便参与者内部发生的所有事情都不会触及外部对象,因此能够扩展并且不会出现锁等资源问题。

于 2015-12-09T14:43:37.127 回答