根据控制器中的参数执行代码
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
};
}
所以我有这个控制器代码,带有依赖注入设置
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
};
}