Bas*_*mme 5 c# reflection dependency-injection interface
你能给我一些基于名称动态加载类的指导吗?该名称在运行时作为参数提供。
static void Main(string[] args)
{
...
}
Run Code Online (Sandbox Code Playgroud)
假设我的论点是“鹦鹉”,那么我想加载我的parrotProcessor课程。如果我的参数名称是“snake”,那么我加载我的 To makesnakeProcessor。当然,这意味着我有一个继承了接口 IProcessor 的鹦鹉和蛇处理器类。我不知道所有处理器的列表可能是什么。此列表由其他开发人员维护,他们可以创建他们想要的内容。
我的处理器接口示例:
public interface IProcessor
{
void Process();
}
Run Code Online (Sandbox Code Playgroud)
在我的 Program.cs
static void Main(string[] args)
{
var processor = GetProcessor(args[0]);
processor.Process();
}
Run Code Online (Sandbox Code Playgroud)
我的问题是我应该在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");
}
}
Run Code Online (Sandbox Code Playgroud)
但这意味着我每次创建一个新的处理器专用类时都必须更新这个丑陋的开关。这不可能。我现在可以为发展而做,但不能长期做。
有哪些解决方案?我应该在 NInject 中使用类似于 DI 的东西还是混合所有东西?我可以简单地使用 Invoke 方法吗?为什么是 Invoke 或 DI?我知道这个问题是一个悬而未决的问题,但它在很多人的代码中经常发生,所以我想有关于它的独特的最佳实践。
你可以使用类似下面的东西
var type = Type.GetType("MyFullyQualifiedTypeName");
var myObject = (MyAbstractClass)Activator.CreateInstance(type);
Run Code Online (Sandbox Code Playgroud)
您需要进行一些字符串修改,例如获取单词、添加处理器字符串并确保所有处理器位于同一位置。
如果您确定该类型位于当前程序集中,只需使用完全限定名称即可
Activator.CreateInstance(Type.GetType("SomeProcessor"));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
114 次 |
| 最近记录: |