无界面访问谷物

时间:2018-08-30 22:34:43

标签: c# iot actor akka.net orleans

我正在计划我的物联网系统,并将Akka.NET与奥尔良进行比较。通常,奥尔良API更接近.NET标准,但我想知道还有其他与Grain进行通信的方法吗?在文档中,我看到我们定义了类似的接口

const config = require('../config/default.json');

Object.keys(config).forEach(key => {
  app.set(key, config[key]);
});

并像这样使用它

public interface IDevice : IGrainWithGuidKey
{
  Task TurnOn(TurnOnCommand command);
  Task TurnOff(TurnOffCommand command);
}

当我们的演员的界面非常严格,但是在家里我们有很多设备,而我不想为每个设备定义100x接口时,这很好。我希望他们每个人都有一套可以处理的命令处理程序,客户端可以调用

IDevice device = GrainFactory.GetGrain<IDevice>(id);

没有为每个定义接口。在奥尔良有可能吗?

1 个答案:

答案 0 :(得分:2)

您可以定义一个接受基类/接口的接口,例如ICommandProcessor<TCommand>并实现该接口的多个版本,因此您可能需要IMyDeviceGrain实现ICommandProcessor<TurnOnCommand>, ICommandProcessor<TurnOffCommand>,依此类推。

在这种情况下,您可以将ICommandProcessor<TCommand>定义为:

public interface ICommandProcessor<TCommand>
{
    Task Process(TCommand command);   
}

谷物界面可能看起来像:

public class IDeviceGrain :
  IGrainWithStringKey,
  ICommandProcessor<TurnOnCommand>,
  ICommandProcessor<TurnOffCommand>
{
}

然后,谷物类将如下所示:

public class DeviceGrain : Grain, IDeviceGrain
{
    Task Process(TurnOnCommand command) { /* turn on */ }
    Task Process(TurnOffCommand command) { /* turn off */ }
}

我还看到人们通过拥有一个具有单个Task Process(object command)调用的谷物来实现此目的,该调用内部使用dynamic根据command的类型进行调度。

我希望能有所帮助。如果您有任何要澄清的地方,请告诉我。