Можно ли переопределить значения параметров при использовании метода Injection с Unity? - PullRequest
1 голос
/ 12 августа 2010

В руководстве по Unity сказано ...

ParameterOverride можно использовать только для конструкторов.

Так почему же параметры методов не указаны?

Приветствия, Ян.

Ответы [ 2 ]

1 голос
/ 20 августа 2010

Причиной, по которой я это оставил, честно говоря, было время разработки и тестирования, а также тот факт, что внедрение метода используется намного, намного меньше, чем внедрение конструктора или свойства.В частности, наши команды по тестированию и документированию держались за ногти, стараясь не отставать от того, что я им бросал, как это было.

Нет никаких технических причин, чтобы это исключать.Объекты Override являются расширяемыми, поэтому вполне разумно создать свои собственные, чтобы переопределить значения параметров метода, если вам это действительно нужно.

1 голос
/ 16 августа 2010

В структурах 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.Я предполагаю, что это будет работать, по крайней мере, это показывает, что должны быть альтернативы предоставлению значений параметров в «время разрешения».

...