Autofac не может разрешить мой зарегистрированный универсальный сервис - PullRequest
1 голос
/ 19 июня 2019

Я зарегистрировал свой универсальный интерфейс в Autofac, но при его разрешении возникает исключение.

Autofac.Core.Registration.ComponentNotRegisteredException: запрошенная служба 'MyCLI.Command.ICommandHandler`1 [[MyCLI.Command.ICommand, MyCLI, версия = 1.0.0.0, культура = нейтральная, 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 голосов
/ 19 июня 2019

Я получил решение, спасибо @Nkosi. Когда я возвращаю ICommand из GetCommandByDescriptor(string descriptor), тип T в способе отправки будет из ICommand типа, который фактически не зарегистрирован, я должен вернуть тип, который реализовал ICommand, например. ListOfDirectoryCommand.

Как хорошо, я иду так:

invoker.Dispatch((dynamic)command);

Таким образом, тип command будет указан во время выполнения.

...