Реализовать цепочку ответственности в StructureMap - PullRequest
0 голосов
/ 11 октября 2019

Представьте себе, что я реализую шаблон проектирования цепочки ответственности в следующих классах:

interface IDoStuff
{
  IDoStuff Next {get;}

  void Configure();
}

class StepOne
{
  public IDoStuff Next {get; set}

  public StepOne(IDoStuff next)
  {
    Next = next;
  }

  public void Configure()
  {
    // Do configuration relevant to StepOne

    // Call the next configure step in the chain
    Next?.Configure()
  }
}

class StepTwo
{
  public IDoStuff Next {get; set}

  public StepTwo(IDoStuff next)
  {
    Next = next;
  }

  public void Configure()
  {
    // Do configuration relevant to StepTwo

    // Call the next configure step in the chain
    Next?.Configure()
  }
}

Я попытался настроить цепочку следующим образом

class MyRegistry : Registry
{
  public MyRegistry()
  {
    For<IDoStuff>().Use<StepOne>();
    For<StepOne>().Use(c => new StepOne(c.GetInstance<StepTwo>()));
    For<StepTwo>().Use(c => new StepTwo(null));
  }
}

Но вместо этого я получаю эту ошибку отStructureMap;

Обнаружены двунаправленные зависимости! Проверьте трассировку стека StructureMap ниже: 1.) IDoStuff (StepOne) 2.) новый StepOne ( По умолчанию IDoStuff ) 3.) StepOne 4.) Экземпляр IDoStuff (StepOne) 5.) Container.GetInstance ()

Как правильно зарегистрировать цепочку?

1 Ответ

0 голосов
/ 14 октября 2019

Я понял это. Мне не нужна первая строка в реестре. Это должно быть так:

class MyRegistry : Registry
{
  public MyRegistry()
  {
    For<IDoStuff>().Use(c => new StepOne(c.GetInstance<StepTwo>()));
    For<StepTwo>().Use(c => new StepTwo(null));
  }
}

Тогда цепочка будет построена так, что если вы сделаете container.GetInstance<IDoStuff>(), она даст вам цепочку, которая будет StepOne => StepTwo => null.

...