Executing code depending on parameter in controller

Viewed 21

So I have this controller code, with dependency injection setup

private IManager manager

public Controller(IManager manager)
{
   this.manager = manager
}

Task async GetAsync(string appId)
{
   await manager.ProcessAsync(appId)
}

Depending on the appid information should be queried from subsystems, so instead of making 1 big manager with a huge switch/case block I would like to create a manager implementation for each subsystem.

What I thought I could do is making an abstract manager class from which the subsystem managers would derive

public interface IManager
{
  Task ProcessAsync(string appId)
}

public abstract class Manager : IManager
{
  public virtual Task ProcessAsync(string appId)
}

public class ManagerA : Manager
{
  public override Task ProcessAsync(string appId)
}

public class ManagerB : Manager
{
  public override Task ProcessAsync(string appId)
}

How can I setup the code (and dependency injection) so my controller calls the right manager depending on the appId parameter? Kind of

Task async GetAsync(string appId)
{
   switch (appId)
   {
      case AppA: 
         managerA.ProcessAsync(appId)
         break;
      case AppB: 
         managerB.ProcessAsync(appId)
         break;
   }      
}
1 Answers

You'll most likely want to use a Factory or Provider for your manager. The factory or provider can produce the correct Manager based on the action parameters. Then you may not need to continue passing the appId around, since each Manager is written for a particular app.

private IManagerProvider managerProvider

public Controller(IManagerProvider managerProvider)
{
   this.managerProvider = managerProvider;
}

Task async GetAsync(string appId)
{
   IManager manager = managerProvider.GetForApp(appId);
   await manager.ProcessAsync(appId); // maybe appId isn't necessary here
}
class ManagerProvider : IManagerProvider
{
    public IManager GetForApp(string appId) => appId switch
    {
        AppA => managerA,
        AppB => managerB
    };
}
Related