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