我希望我的术语正确,但这是我的情景:
我有一组实现接口的具体类: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包含不可解析的类型参数。该类型永远不会被解析,因此不适合使用。
所以我有以下问题:
答案 0 :(得分:1)
它无法解决的类型参数是什么?
QaCommandHandler
中只有一个类型参数,即TEntity
。这是无法解决的类型论证。由于实现的接口不使用此类型参数,因此它可以是任何内容,而Simple Injector无法猜出要为您填写哪种类型。
如何修改我的注册以便它可以解决依赖关系?
我不知道。你的命令中没有任何地方你似乎指定了实体。