Autofac无法解析我的注册通用服务

时间:2019-06-19 12:34:41

标签: c# .net-core autofac ioc-container

我已经在Autofac中注册了我的通用接口,但是当我解决它时,抛出了异常。

  

Autofac.Core.Registration.ComponentNotRegisteredException:请求的服务'MyCLI.Command.ICommandHandler`1 [[[MyCLI.Command.ICommand,MyCLI,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]]'还没有已注册。

     
    

为避免此异常,请注册一个组件以提供服务,或者使用IsRegistered()检查服务注册,或者使用ResolveOptional()方法解决可选的依赖项。

  

Program.cs

    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);
    }
}

GetCommandByDescriptor

    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;
    }

1 个答案:

答案 0 :(得分:0)

我得到了解决方案,谢谢@Nkosi。 当我从ICommand返回GetCommandByDescriptor(string descriptor)时,Dispatch方法中的类型T会来自实际上尚未注册的ICommand类型,我应该返回已实现{{1 }}例如ICommand

我也是这样:

ListOfDirectoryCommand

因此invoker.Dispatch((dynamic)command); 的类型将在运行时指定。