В структурах DI у нас обычно есть инъекция конструктора или инъекция свойства .
Внедрение в конструктор - это когда платформа создает экземпляры и автоматически предоставляет экземпляры, соответствующие параметрам конструктора.
Внедрение свойства - это когда после создания экземпляра любое свойство с типом, поддерживаемым контейнером, автоматически устанавливается на экземпляр этого типа.
Параметры обычно не поддерживаются ссвойства, поэтому PropertyOverride
имеет смысл только с внедрением конструктора.
Обновление: внедрение метода в Unity позволяет вызывать метод на экземпляре, передавая параметры ввызов метода:
container.RegisterType<DriveController>(
new InjectionMethod("InitializeMe", 42.0,
new ResolvedParameter<ILogger>("SpecialLogger")));
Класс InjectionMethod
заставляет вас указывать значения для всех параметров методов.Использование ParameterOverride
не имеет большого смысла в этом случае, так как мы уже предоставили явные значения для решателя для использования.
Примечание: техническая причина того, почему ParameterOverride
работает толькос параметрами конструктора является то, что поддержка переопределений для методов имеет некоторые проблемные случаи.Рассмотрим следующий класс:
public class Foo
{
public Foo(IService service) { ... }
public void Initialize(IService service) { ... }
}
container.Resolve<IFoo>(new ParameterOverride("service", new Service()));
Какой параметр должен быть переопределен?
Если вам необходимо предоставить значения параметров при разрешении, я бы предложил вместо этого использовать фабричные делегаты.Преобразование примера выше:
container.RegisterInstance<Func<int, DriveController>>(
number => {
var dc = new DriveController();
dc.InitializeMe(number, container.Resolve<ILogger>("SpecialLogger"));
return dc;
});
var factory = container.Resolve<Func<int, DriveController>>();
var dc = factory(42);
Я не пробовал это с Unity.Я предполагаю, что это будет работать, по крайней мере, это показывает, что должны быть альтернативы предоставлению значений параметров в «время разрешения».