Autofac Параметр впрыска - PullRequest
2 голосов
/ 01 мая 2019

Я неправильно понимаю документацию Autofac о передаче параметров в метод Resolve. Ниже приведен минималистический пример того, что я имею в виду:

Пример

https://dotnetfiddle.net/fz5eTp

public static void Main()
{
  var cb = new ContainerBuilder();
  cb.RegisterType<A>();
  cb.Register<B>((c, p) => new B(p.TypedAs<C>()));
  using (var c = cb.Build())
  {
    // works
    c.Resolve<B>(TypedParameter.From(new C()));
    // fails
    c.Resolve<A>(TypedParameter.From(new C()));
  }
}
public class A { public A(B b) { } }
public class B { public B(C c) { } }
public class C { }

Ожидаемое

Я ожидал, что TypedParameter будет передан в класс B.

К сожалению, сообщение об исключении «Последовательность не содержит элементов» предполагает, что ни один параметр не был передан.

Вопрос

Как передать параметры (известные только во время разрешения) конструкторам более низкого уровня? Или в этом конкретном примере, как передать параметр C до B при разрешении A .

1 Ответ

1 голос
/ 01 мая 2019

Option1

Самый простой способ, который я могу придумать, - это разделить процесс разрешения на два шага:

Сначала вы можете разрешить B по указанному известному значению C вво время выполнения сохраните его в myB справочном значении:

B myB = c.Resolve<B>(TypedParameter.From(new C()));

, а затем передайте myB значение преобразователю A:

A myA = c.Resolve<A>(TypedParameter.From(myB));

Вы можете найти полноерабочий пример в моем GitHub (с выводом).

Option2

Если вы хотите написать одну строку кода во время разрешения, вам нужно будет изменить регистрA и B с:

cb.Register<A>((c, p) =>
{
    B myB = c.Resolve<B>(p);
    return new A(myB);
});
cb.Register<B>((c, p) => {
    C myC = p.Named<C>("myC");
    return new B(myC);
});

А затем:

A myA = c.Resolve<A>(new NamedParameter("myC", new C()));

Опять же, вы можете найти полный рабочий пример в моем GitHub (свыход).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...