Можно ли зарегистрировать класс с параметром, который, как ожидается, будет передан с точки создания?
Я знаю, что это можно сделать примерно так:
GlobalContainer.RegisterType<TUserProcessor>.Implements<IUserUpgrader>.
AsTransient.DelegateTo(
function: TUserProcessor
begin
Result := TUserProcessor.Create(GetCurrentUser);
end
);
Но там параметры привязаны к контексту выполнения, в котором регистрируется контейнер, а не там, где объект получает объект.
Что-то подобное, например, возможно?
GlobalContainer.Resolve<IMathService>([FCurrentUser]);
Я знаю, что у некоторых защитников есть очень простые конструкторы, но бывают случаи, когда параметр конструктора явно выглядит так:
Созданному объекту необходим параметр объекта для работы, поэтому ссылка должна быть удовлетворена. Параметр также делает это ограничение намного более очевидным, глядя на класс.
Вы можете назначить ссылку в методе или свойстве, а также вызвать и исключить в любом другом методе, если попытаетесь использовать объект без предварительного назначения. Мне не нравится писать этот тип кода, это просто пустая трата времени, просто используйте параметр конструктора и проверьте там. Чем меньше кода, тем лучше ИМО.
Кроме того, передаваемый объект является локальным по отношению к объекту, который создает новый объект с использованием контейнера (например, объект Transaction) и имеет некоторое состояние (это не новый объект, который я могу получить с помощью контейнера).