[英]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.