繁体   English   中英

Akka.net /泛型和数据库与实体框架

[英]Akka.net / Generics and Database & Entity Framework

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

我正在研究访问数据库的actor。 一个是阅读,一个是写作。 两者都是路由器的主人,根据工作负载根据需要创建它们。

为了避免为数据库中的每个类型创建,我想将Generics与Expressions结合使用。 消息沿着以下行:

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中我想使用Expression定义并检索实体按照要求进行进一步处理或至少发回它们 - 如下所示:

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:由于actor系统与任何外部请求者通信,因此它们共享一组公共对象定义 - 如数据库对象。

尽管如此,我认为你的方法是完全错误的。

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

你没有在这里传递消息,你正在传递代码行。

您可能需要咬住子弹并将操作包装在不可变消息中并传递它们,以便在actor中发生的所有事情都不会触及外部对象,因此可以扩展并且不会出现锁定等资源问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM