Доступ зерна без интерфейса - PullRequest
0 голосов
/ 31 августа 2018

Я планирую свою систему IoT и сравниваю Akka.NET с Орлеаном. В целом Orleans API ближе к стандартам .NET, но мне интересно, есть ли другой способ связи с Grain? В документации я вижу, что мы определяем интерфейс как

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

И используйте это так

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

Это хорошо, когда у нас есть актеры с очень строгим интерфейсом, но дома у нас много устройств, и я не хочу определять 100-кратные интерфейсы для каждого из них. Я бы предпочел, чтобы у каждого из них был набор обработчиков для команд, которые он может обрабатывать, и клиент мог бы вызывать

device.Execute(new TurnOnCommand()) 

без определения интерфейса для каждого. Возможно ли это в Орлеане?

1 Ответ

0 голосов
/ 31 августа 2018

Вы можете определить интерфейс, который принимает базовый класс / интерфейс, такой как 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.

Надеюсь, это поможет. Пожалуйста, дайте мне знать, если есть какие-либо вопросы, которые вы хотели бы уточнить.

...