Description
Describe the bug
ActorService allows implementing custom actor state providers. The Interface IActorStateProvider requires implementing the method
Task<ReminderPagedResult<KeyValuePair<ActorId, List<ActorReminderState>>>> GetRemindersAsync(
int numItemsToReturn, ...); // parameters omitted for brevity
The problem is in the return type "List<ActorReminderState>". ActorReminderState is public non-sealed class and as such can be subclassed, yet its constructor is internal - One cannot create instances of the subclass.
Related issues cascade through the code as well:.ActorStateReminder constructor parameters are internal classes as well,
To Reproduce
Create new project, import the actors NuGet package, create a subclass of ActorReminder state with a 3-param constructor that calls the base class. Compiler error because the base class constructor is internal. Example:
public class SubActorReminderState : ActorReminderState, IActorReminderState
{
/*Properties
*/
//Constructor
public SubActorReminderState(ActorReminderData reminder, TimeSpan currentLogicalTime, ReminderCompletedData reminderCompletedData) : base(reminder,currentLogicalTime,reminderCompletedData) //calling base gives compiler error
Expected behavior
Be able to implement reminders for the state provider.
Possible solutions:
- Make the ActorReminderState constructor and parameter classes public
- Make GetRemindersAsync return List<IActorReminderState>
Additional context
-
There is an Interface IActorReminderState that ActorReminderState implements. The new signature of GetRemindersAsync could be
Task<ReminderPagedResult<KeyValuePair<ActorId, List<IActorReminderState>>>> GetRemindersAsync( int numItemsToReturn, ...); // parameters omitted for brevity
and a user can then implement the IActorReminderState interface, ActorReminderState can stay as-is.
Caveat: the interface would have to include additional properties and methods, non-interface properties and methods of ActorReminderState are used throughout the project.