我有一个项目,它有命令和命令执行器类,它们接受给定的命令并做一些事情。
我使用结构映射和泛型来为我想在我的系统中运行的任何给定命令查找和创建执行器的实例。
例如:
我有一个基本执行程序类
public abstract class BaseExecutor<T> : IExecutor<T>
{
//do something
}
这是一个执行器的示例,它应该由结构映射为以下命令类创建:MyFakeCommand
public class MyFakeCommandExecutor : BaseExecutor<MyFakeCommand>
{
public void Run(MyFakeCommand cmd)
{
//do something
}
}
要将执行程序连接到命令,请通过调用 ConnectImplementationsToTypesClosing 配置结构映射。
public void RegisterExecutionAssembly<T>()
{
IocContainer.Configure(c => c.Scan(scanner =>
{
scanner.AssemblyContainingType<T>();
scanner.ConnectImplementationsToTypesClosing(typeof(IExecutor<>));
}));
}
并找到给定命令的执行者,我调用以下命令
public IExecutor<T> GetExecutorFor<T>()
{
return IocContainer.GetAllInstances<IExecutor<T>>().FirstOrDefault();
}
因此,要为命令运行执行程序,我可以执行以下操作:
var cmd = new MyFakeCommand();
var executor = GetExecutorFor(cmd);
executor.Run(cmd);
这一切都很好,直到我开始动态创建命令。
例如:
string commandTypeFullName = "Namespace.MyFakeCommand"
Type cmdType = Type.GetType(commandTypeFullName);
var cmd1 = JsonConvert.DeserializeObject(strCommand, cmdType);
var cmd2 = ObjectFactory.GetInstance(cmdType);
GetExecutorFor(cmd1); // fails to find executor
GetExecutorFor(cmd2); // fails to find executor
所以我的问题是如何配置结构映射以仍然找到动态实例化对象的执行器?