Injection Constructor Dependency Injection с параметрами

Я пытаюсь понять, как разрешить несколько параметров, передаваемых конструктору из контейнера DI.

У меня есть интерфейс IDataAccess (№1) и класс с именем SQL, реализующий IDataAccess (№2). Другой класс ObjectBroker (#3), предоставляющий экземпляр любого конкретного класса, реализующего интерфейс. Я использую контейнер единства для внедрения зависимостей конструктора, как показано в (# 4).

Все это работает хорошо, пока я не попытаюсь добавить больше параметров в конструктор ObjectBorker. Например, если я сделаю это --> public ObjectBroker(IDataAccess da, string s), то я не смогу понять, как разрешить параметры для контейнера DI?

    //region #1  
    public interface IDataAccess
    {
        string GetDataBaseName();
    }
    //endregion


    //region #2  
    public class SQL : IDataAccess 
    {

        public string GetDataBaseName()
        {
            return "Data retrieved from SQL, Microsoft";
        }
    }
    //endregion

    //region #3  
    public class ObjectBroker 
    {
        private IDataAccess dataAccess;
        
        public ObjectBroker(IDataAccess da)  //Fails if I have public ObjectBroker(IDataAccess da, string s)
        {
            dataAccess = da;
        }
        public string GetDataBaseName()
        {
            return dataAccess.GetDataBaseName();
        }
    }
    //endregion

    //region #4 
    IUnityContainer iuContainer3 = new UnityContainer();            
    iuContainer3.RegisterType<IDataAccess, SQL>("SQL");

    var con = new InjectionConstructor(iuContainer3.Resolve<IDataAccess>("SQL"));
    iuContainer3.RegisterType<BusinessFactory>("SQL", con);
    //endregion

Пробовал это var con = new InjectionConstructor(iuContainer3.Resolve(new ResolverOverride[] { new ParameterOverride("da", "SQL"), new ParameterOverride("s", "PSQL") }));

Но получая сообщение об ошибке Unity.ResolutionFailedException: «Разрешение не выполнено с ошибкой: для типа DependencyInjection.IDataAccess нет общедоступного конструктора.

Laravel с Turbo JS
Laravel с Turbo JS
Turbo - это библиотека JavaScript для упрощения создания быстрых и высокоинтерактивных веб-приложений. Она работает с помощью техники под названием...
Типы ввода HTML: Лучшие практики и советы
Типы ввода HTML: Лучшие практики и советы
HTML, или HyperText Markup Language , является стандартным языком разметки, используемым для создания веб-страниц. Типы ввода HTML - это различные...
Аутсорсинг разработки PHP для индивидуальных веб-решений
Аутсорсинг разработки PHP для индивидуальных веб-решений
Услуги PHP-разработки могут быть экономически эффективным решением для компаний, которые ищут высококачественные услуги веб-разработки по доступным...
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
Слишком много useState? Давайте useReducer!
Слишком много useState? Давайте useReducer!
Современный фронтенд похож на старую добрую веб-разработку, но с одной загвоздкой: страница в браузере так же сложна, как и бэкенд.
Узнайте, как использовать теги &lt;ul&gt; и &lt;li&gt; для создания неупорядоченных списков в HTML
Узнайте, как использовать теги <ul> и <li> для создания неупорядоченных списков в HTML
HTML предоставляет множество тегов для структурирования и организации содержимого веб-страницы. Одним из наиболее часто используемых тегов для...
2
0
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Решение с использованием InjectionConstructor:

var con = new InjectionConstructor(iuContainer3.Resolve<IDataAccess>("SQL"), "PSQL");
iuContainer3.RegisterType<ObjectBroker>("SQL", con);

InjectionConstructor создается с двумя параметрами:

  • iuContainer3.Resolve<IDataAccess>("SQL"), который будет сопоставлен с параметром конструктора da.
  • PSQL, который будет сопоставлен с параметром конструктора s.

Вот полный интерактивный пример.

Решение с использованием InjectionFactory:

iuContainer3.RegisterType<ObjectBroker>("SQL", new InjectionFactory(CreateDataAccessLayer));

private static IDataAccess CreateDataBaseLayer(IUnityContainer container)
{
    var da = container.Resolve<IDataAccess>();
    return new ObjectBroker(da, "PSQL");
}

Извините, если я не понял, моя цель - добиться чего-то вроде этого... ObjectBroker bSQL3 = iuContainer3.Resolve<ObjectBroker>("SQL"); Console.WriteLine($"Запрашиваемое название компании: {bSQL3.GetDataBaseName()}"); чтобы он печатал вывод. Но когда я использую ваше первое решение, я не могу решить, и я все еще получаю ту же ошибку времени выполнения.

Prasanth Sarath 13.02.2023 16:22

@PrasanthSarath, я не могу воспроизвести твое поведение. Внутри репла работает отлично: replit.com/@VadimMartynov/…

Vadim Martynov 13.02.2023 16:36

Фантастика! Я видел интерактивный пример, и он работал как шарм. Замечательно, спасибо не только за решение моей проблемы, но и за то, что вы дали интерактивный пример, который мне очень помог, большое спасибо

Prasanth Sarath 13.02.2023 16:48

Другие вопросы по теме