Как мне захватить контекст разрешения для автоматической фабрики (Func <T>) в контейнере Unity - PullRequest
0 голосов
/ 06 октября 2018

Я пытаюсь создать сценарий, в котором я могу использовать Per Resolve Lifetime Manager, но также могу использовать автоматические фабрики Unity.Я хотел бы, чтобы разрешение использовало то же состояние из исходного разрешения, но отложило разрешение до того времени, когда я вызову фабричный метод.Мой пример использования: я хочу, чтобы мой менеджер транзакций базы данных передавал зависимость, если я вызываю фабричный метод, но не трачу время и ресурсы на создание зависимости, если она не используется.

Я думал, что ясоздаст новый делегат и зарегистрирует его в том же стиле, что и Func, но я не уверен, какая точка ввода правильная.

public class MainMethod
{
  private readonly DependencyOne _dependencyOne;

  public MainMethod(DependencyOne dependencyOne)
  {
    _dependencyOne = dependencyOne;
  }
}

public class DependencyOne
{
  private readonly Defer<DependencyTwo> _dependencyTwo;
  private readonly TransactionManager _transactionManager;

  public DependencyOne(Defer<DependencyTwo> dependencyTwo, 
                        TransactionManager transactionManager)
  {
    _dependencyTwo = dependencyTwo;
    _transactionManager = transactionManager;
  }
  public DataMethod(Data data)
  {
    transactionManager.DoSomething();
    _dependencyTwo().Datamethod(data);  
  }
}
public class DependencyTwo
{
  private readonly Defer<DependencyTwo> _dependencyTwo;
  private readonly TransactionManager transactionManager;
  public DependencyOne(Defer<DependencyTwo> dependencyTwo, 
                        TransactionManager _transactionManager)
  {
    _dependencyTwo = dependencyTwo;
    _transactionManager = transactionManager;
  }
  public DataMethod(Data data)
  {
    transactionManager.DoSomething(); //Same Transaction Manager
    Datamethod(data);  
  }
}

Таким образом, в этом примере, когда MainMethod будет разрешен, Unity разрешит DependencyOne немедленно, но DependencyTwo будет разрешен только при вызове DataMethod.

Я создал класс-обертку, который может захватывать параметры в области, но это не идеально, и я хотел бы использовать для этого единицу.

...