[英]Access grain without interface
我正在計划我的物聯網系統,並將Akka.NET與Orleans進行比較。 通常,奧爾良API更接近.NET標准,但我想知道還有其他與Grain進行通信的方法嗎? 在文檔中,我看到我們定義了接口
public interface IDevice : IGrainWithGuidKey
{
Task TurnOn(TurnOnCommand command);
Task TurnOff(TurnOffCommand command);
}
像這樣使用
IDevice device = GrainFactory.GetGrain<IDevice>(id);
當我們的演員具有非常嚴格的界面但在家里我們有很多設備並且我不想為每個設備定義100x接口時,這很好。 我希望他們每個人都有一套可以處理的命令處理程序,客戶端可以調用這些處理程序
device.Execute(new TurnOnCommand())
無需為每個接口定義接口。 在奧爾良有可能嗎?
您可以定義一個接受基類/接口的接口,例如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)
調用的谷物來實現此目的,該谷物在內部根據command
類型在內部使用dynamic
進行調度。
希望對您有所幫助。 如果您有任何要澄清的地方,請告訴我。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.