您好,我是 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/