指定されたコマンドを実行して何かを実行するコマンドとコマンド実行クラスを持つプロジェクトがあります。
構造マップとジェネリックを使用して、システムで実行したい特定のコマンドのエクセクターのインスタンスを見つけて作成します。
例えば:
私は基本エグゼキュータクラスを持っています
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
だから私の質問は、構造マップを構成して、動的にインスタンス化されたオブジェクトのエクセクターを見つけるにはどうすればよいですか?