好的我刚刚在我们的应用程序中实现了一个Command-CommandHandler模式,它将命令对象添加到队列中;然后使用Castle Windsor的依赖注入和泛型方法来获取命令对象的相关处理程序。
Command接口是空白的,如下所示:
public interface ICommand
{
}
虽然CommandHandler接口像这样处理它:
public interface ICommandHandler<TCommand> where TCommand : ICommand
{
void Handle(TCommand command);
}
然后通过我希望通过队列发送的命令实现这些;然后通过DependencyRegistration包装器在Castle Windsor注册,如下所示:
_dependencyRegister
.AddRegistration<ICommandHandler<TestCommand>, TestCommandHandler>();
因此,将添加到队列的每个命令都使用处理程序映射1到1;然后在Castle Windsor注册;所以我们可以使用这样的通用方法来获取特定Command对象的相关CommandHandler:
private void HandleCommand<T>(T queueItem) where T: ICommand
{
var handler = _dependencyResolver.Resolve<ICommandHandler<T>>();
handler.Handle(queueItem);
}
最后一部分是队列调度程序方法,如下所示:
private void DispatchQueueItem(ICommand queueItem)
{
HandleCommand(queueItem);
}
右;问题是当我将一个命令作为ICommand从队列中拉出并将其传递给DispatchQueueItem方法时;当它被发送到HandleCommand方法时,“T”类型总是设置为“ICommand”接口;而不是接口的实际实现(DependencyRegistration示例代码中的TestCommand)。
我的问题是;如何设置HandleCommand方法以获取实现的类型;不是界面?
答案 0 :(得分:4)
将您的调度方法更改为通用:
private void DispatchQueueItem<T>(T queueItem)
where T: ICommand
{
HandleCommand(queueItem);
}
更新你可以强制C#在运行时以这种方式定义对象类型
private static void DispatchQueueItem(ICommand queueItem)
{
HandleCommand((dynamic)queueItem);
}
答案 1 :(得分:0)
我认为你想要它是界面 - 但你只需要在那里定义一个方法契约 - 比如:
public interface ICommand
{
void Execute();
}
//Concrete implementation:
public TestCommand : ICommand
{
public void Execute()
{
//Do something
}
}
然后,当您从DI中获取ICommand时 - 您可以调用queueItem.Execute()
- 这将引用您已分配的任何具体实现。
答案 2 :(得分:0)
您的队列将始终调度命令。所以需要获得“引擎盖下”的类型:
private void HandleCommand<T>(T queueItem) where T: ICommand
{
var typeParam = queueItem.GetType();
var type = typeof(ICommandHandler<>).MakeGenericType(typeParam);
var handler = _dependencyResolver.Resolve(type);
我不确定确切的sintax。没有与温莎城堡的项目。