【发布时间】:2020-04-09 15:38:26
【问题描述】:
您能否给我一些指导以根据名称动态加载类。该名称在运行时作为参数提供。
static void Main(string[] args)
{
...
}
假设我的论点是“鹦鹉”,那么我想加载我的 parrotProcessor 类。如果我的参数名称是“snake”,那么我会加载我的 To make snakeProcessor。当然,这意味着我有一个继承接口 IProcessor 的鹦鹉和蛇处理器类。我不知道所有处理器的列表是什么。此列表由其他开发人员维护,他们可以创建他们想要的内容。
我的处理器接口示例:
public interface IProcessor
{
void Process();
}
在我的 Program.cs 中
static void Main(string[] args)
{
var processor = GetProcessor(args[0]);
processor.Process();
}
我的问题是我应该在GetProcessor() 方法中做什么?
这是我此刻所拥有的:
private IProcessor GetProcessor(string name)
{
switch (name)
{
case "ant":
return new AntProcessor();
case "parrot":
return new ParrotProcessor();
case "snake":
return new SnakeProcessor();
default:
throw new ArgumentException("Case not found");
}
}
但这意味着我必须在每次创建新的处理器专用类时更新这个丑陋的开关。这不可能。我现在可以进行开发,但不能长期使用。
有什么解决办法?我应该在 NInject 中使用类似于 DI 的东西还是混合所有东西?我可以简单地使用 Invoke 方法吗?为什么 Invoke 或 DI?我知道这个问题有点悬而未决,但它在很多人的代码中经常发生,所以我想有关于它的独特的最佳实践。
【问题讨论】:
标签: c# reflection dependency-injection interface