Autofa c множественная реализация одного и того же интерфейса и агрегатов вызывается в логике if - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть интерфейс ibaseinterface, с помощью которого я создал 2 класса, скажем, baseclass1 и baseclass2.

Теперь у меня есть класс с именем верхнего уровня, как показано ниже

public class toplevel
{
    public ibaseinterface selection(string selection)
    {
        int.TryParse(selection, out int sel);
        if (sel < 2)
            return new baseclass1();
        else
            return new baseclass2();
    }
}

based при вводе пользователем я выбираю класс, который нужно вызвать. так как мне разрешить зависимости, в этом случае, используя autofa c.

Примечание: у меня определенно не может быть разных интерфейсов для базовых классов.

1 Ответ

0 голосов
/ 26 апреля 2020

Если вам нужно выбрать реализацию, основанную на некоторых данных времени выполнения, три типичных решения:

  • Шаблон проектирования Proxy
  • Шаблон проектирования Adapter
  • Шаблон фабричного дизайна.

Вот пример шаблона фабричного дизайна:

public interface IBaseInterfaceFactory
{
    ibaseinterface selection(string selection);
}

public class toplevel
{
    private readonly IBaseInterfaceFactory factory;
    public toplovel(IBaseInterfaceFactory factory) => this.factory = factory;

    public ibaseinterface selection(string selection)
    {
        return this.factory.selection(selection);
    }
}

// This class depends on Autofac and should therefore be placed near your Autofac registations.
internal class AutofacBaseInterfaceFactory : IBaseInterfaceFactory
{
    private readonly IComponentContext context;
    public AutofacBaseInterfaceFactory(IComponentContext context) => this.context = context;

    public ibaseinterface selection(string selection)
    {
        int.TryParse(selection, out int sel);
        if (sel < 2)
            return this.context.Resolve<baseclass1>();
        else
            return this.context.Resolve<baseclass2>();
    }
}

Это можно связать, используя следующий код:

builder.RegisterType<toplevel>().AsSelf();
builder.RegisterType<AutofacBaseInterfaceFactory>().As<IBaseInterfaceFactory>();
builder.RegisterType<baseclass1>().AsSelf();
builder.RegisterType<baseclass2>().AsSelf();

Обратите внимание, что в случае, если работа toplevel состоит в том, чтобы просто вернуть IBaseInterfaceFactory, в этом случае cae toplevel уже действует как фабрика, и в этом случае она может быть полностью уменьшена из уравнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...