根据控制器中的参数执行代码

Executing code depending on parameter in controller

所以我有这个控制器代码,带有依赖注入设置

private IManager manager

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

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

根据 appid 信息应该从子系统中查询,所以我不想用一个巨大的 switch/case 块创建 1 个大管理器,我想为每个子系统创建一个管理器实现。

我认为我可以做的是制作一个抽象管理器class,子系统管理器将从中派生

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)
}

如何设置代码(和依赖项注入)以便我的控制器根据 appId 参数调用正确的管理器? 种类

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

您很可能希望为您的经理使用 Factory 或 Provider。工厂或供应商可以根据动作参数生产出正确的Manager。那么您可能不需要继续传递 appId,因为每个管理器都是为特定应用程序编写的。

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
    };
}