我已经在Autofac中注册了我的通用接口,但是当我解决它时,抛出了异常。
Autofac.Core.Registration.ComponentNotRegisteredException:请求的服务'MyCLI.Command.ICommandHandler`1 [[[MyCLI.Command.ICommand,MyCLI,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]]'还没有已注册。
为避免此异常,请注册一个组件以提供服务,或者使用IsRegistered()检查服务注册,或者使用ResolveOptional()方法解决可选的依赖项。
static void Main(string[] args)
{
ContainerBuilder builder = new ContainerBuilder();
var container = builder.RegisterTypes();
var invoker = new Invoker(container);
var command = TypeHelper.GetCommandByDescriptor("LS");
invoker.Dispatch(command);
Console.Read();
}
public static IContainer RegisterTypes(this ContainerBuilder builder)
{
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
.AsClosedTypesOf(typeof (ICommandHandler<>)).AsImplementedInterfaces();
return builder.Build();
}
public class Invoker : IInvoker
{
private readonly IContainer container;
public Invoker(IContainer container)
{
this.container = container;
}
public void Dispatch<T>(T command) where T : ICommand
{
//if (!container.IsRegistered(typeof(ICommandHandler<>))) return;
var candidate = container.Resolve<ICommandHandler<T>>();
candidate.Execute(command);
}
}
public static ICommand GetCommandByDescriptor(string descriptor)
{
var classes = GetAllCommands();
var command = classes.First(x => x.GetType()
.GetCustomAttributes<CommandDescriptorAttribute>().First().CommandName.Equals(descriptor, StringComparison.OrdinalIgnoreCase));
return command;
}
答案 0 :(得分:0)
我得到了解决方案,谢谢@Nkosi。
当我从ICommand
返回GetCommandByDescriptor(string descriptor)
时,Dispatch方法中的类型T
会来自实际上尚未注册的ICommand
类型,我应该返回已实现{{1 }}例如ICommand
。
我也是这样:
ListOfDirectoryCommand
因此invoker.Dispatch((dynamic)command);
的类型将在运行时指定。