我正在计划我的物联网系统,并将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);
没有为每个定义接口。在奥尔良有可能吗?
答案 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
的类型进行调度。
我希望能有所帮助。如果您有任何要澄清的地方,请告诉我。