Я пытаюсь понять, как разрешить несколько параметров, передаваемых конструктору из контейнера 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 нет общедоступного конструктора.
Решение с использованием 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");
}
@PrasanthSarath, я не могу воспроизвести твое поведение. Внутри репла работает отлично: replit.com/@VadimMartynov/…
Фантастика! Я видел интерактивный пример, и он работал как шарм. Замечательно, спасибо не только за решение моей проблемы, но и за то, что вы дали интерактивный пример, который мне очень помог, большое спасибо
Извините, если я не понял, моя цель - добиться чего-то вроде этого... ObjectBroker bSQL3 = iuContainer3.Resolve<ObjectBroker>("SQL"); Console.WriteLine($"Запрашиваемое название компании: {bSQL3.GetDataBaseName()}"); чтобы он печатал вывод. Но когда я использую ваше первое решение, я не могу решить, и я все еще получаю ту же ошибку времени выполнения.