Simple Injector:提供的类型QaCommandHandler包含不可解析的类型参数

时间:2017-03-08 03:29:57

标签: c# generics simple-injector

我希望我的术语正确,但这是我的情景:

我有一组实现接口的具体类:ICommandHandler<TCommand>

ICommandHandler<TCommand>接口有一个与正在处理的命令相关的类型参数,如下所示:

public interface ICommandHandler<in TCommand>
    where TCommand : ICommand
{
    void Handle(TCommand command);
}

非常直截了当,但我有一个包装这些命令处理程序的装饰器:

public class QaDecorator<TCommand> : ICommandHandler<TCommand>
    where TCommand : IQaCommand
{
    private readonly ICommandHandler<TCommand> _handler;
    private readonly ICommandHandler<CreateQaItemCommand<TCommand>> _createQaHandler;
    private readonly ICommandHandler<UpdateQaDataCommand<TCommand>> _updateQaHandler;

    public QaDecorator(
        ICommandHandler<TCommand> handler,
        ICommandHandler<CreateQaItemCommand<TCommand>> createQaHandler,
        ICommandHandler<UpdateQaDataCommand<TCommand>> updateQaHandler)
    {
        _handler = handler;
        _createQaHandler = createQaHandler;
        _updateQaHandler = updateQaHandler;
    }

    public void Handle(TCommand command)
    {
        // If conditionA is met
        if (conditionA == true)
        {
            _updateQaHandler.Handle(updateQaData);
            return;
        }

        // If conditionB is met
        if (conditionB == true)
        {
            _createQaHandler.Handle(createQaItem);
            return;
        }

        // Otherwise...
        _handler.Handle(command);
    }
}

正如你所看到的,这里的愿望是拥有一个装饰器,它可以在某些条件下将命令重定向到一般执行某些操作的不同命令,这意味着它与原始命令的关系并不重要。

很抱歉很长时间的介绍,但事情正在发生变化。我尝试使用正确的配置连接Simple Injector来处理这个问题,我有以下内容:

container.Register(typeof(ICommandHandler<>), new[] {typeof(ICommandHandler<>).Assembly}, Lifestyle.Scoped);
container.Register(typeof(ICommandHandler<>), typeof(QaCommandHandler<>), Lifestyle.Scoped);
container.RegisterDecorator(
    typeof(ICommandHandler<>),
    typeof(QaDecorator<>),
    Lifestyle.Scoped);

请记住QaCommandHandler<>实现了以下接口:

public class QaCommandHandler<TEntity> : ICommandHandler<UpdateQaDataCommand<IQaCommand>>, ICommandHandler<CreateQaItemCommand<IQaCommand>>

我得到的错误是:

  

提供的类型QaCommandHandler包含不可解析的类型参数。该类型永远不会被解析,因此不适合使用。

所以我有以下问题:

  1. 无法解决的类型参数是什么?
  2. 如何修改我的注册以便它可以解决依赖关系?

1 个答案:

答案 0 :(得分:1)

  

它无法解决的类型参数是什么?

QaCommandHandler中只有一个类型参数,即TEntity。这是无法解决的类型论证。由于实现的接口不使用此类型参数,因此它可以是任何内容,而Simple Injector无法猜出要为您填写哪种类型。

  

如何修改我的注册以便它可以解决依赖关系?

我不知道。你的命令中没有任何地方你似乎指定了实体。