Здесь был дан ответ на похожий вопрос:
Как передать параметр времени выполнения как часть разрешения зависимости?
Однако мне было интересно, как этоможет быть сделано при регистрации универсального класса?
Обычно я регистрирую его следующим образом:
services.AddScoped(typeof(ITest<>), typeof(Test<>));
Но что, если я хочу передать параметр времени выполнения в конструктор?Без использования DI это было бы что-то вроде:
new Test<MyClass>(string mystring, int myInt)
В связанном ответе предлагается использовать фабричный метод, но это выдает ошибку, если я не передам точный тип.
Альтернативой может быть получение экземпляра без передачи параметра времени выполнения в конструкторе и вместо этого использования метода установщика после получения точного экземпляра.Однако я хотел бы избежать этого, потому что каждый раз после получения экземпляра вы должны не забывать вызывать метод setter.
Есть ли способ обойти это?Я думаю, я мог бы использовать какой-нибудь фабричный класс вместо регистрации его в классе запуска ...
РЕДАКТИРОВАТЬ: После прочтения очень полезного ответа Стивена я обновил вопрос более конкретным примером: Следующий пример находится внутри некоторого метода:
//instance of repository are passed inside constructor of class
//calling some to update/insert
//IMPORTANT - calling external service I want save parameters to db no matter what
using(var ctx=new DbContext())
{
//create log object
ctx.logs.add(Obj)
ctx.save()
}
//some code after
Допустим, я хочу быть непротиворечивым и вызвать метод моего репозитория logging, добавить туда объект logging и сохранить все в базе данных. Однако каждый репозиторий в конструкторе принимает DbContext, который зарегистрирован как scoped (за один запрос)).Если это внутри транзакции, сохранение зависит от кода после вызова внешней службы, и он может генерировать исключение и ничего не сохранять.
Так что да, я мог бы создать новый dbContext и передать его в метод ведения журнала или вызвать некоторую частную функцию ведения журнала и сохранитьвнутри, но суть в том, что если бы я попросил экземпляр loggingRepository, я бы хотел, чтобы DI передавал эту локально созданную переменную dbContext конструктору, а не одну, зарегистрированную как область видимости внутри метода запуска, так что добавление и сохранение журнала происходит независимо от того, какая внешняя службаили код после вызова делает.
Моя ситуация в чем-то похожа, но она собирается для некоторых данных в БД на основе текущего пользователя, и я не хочу передавать один и тот же параметр многочисленным методам, но только внутри конструктора класса.