Как передать аргумент во время выполнения? - PullRequest
0 голосов
/ 13 декабря 2018

Мы мигрируем из StructureMap в Lamar, но я не смог найти «версию Lamar» для передачи аргументов во время выполнения.

У нас есть класс, который требует строковый аргумент (псевдокод):

public class MyRepository {
  public MyRepository(string accountId) {}
}

… и фабрика

public class MyRepoFactory(Container container) {
  public MyRepository GetRepositoryForAccount(string accountId) => 
     container
        // With() is not available in Lamar?
        .With("accountId").EqualTo(accountId)
        .GetInstance<IMyRepository>();
}

На самом деле существуют дополнительные зависимости.

Как можно сказать Lamar GetInstance() для IMyRepository и использовать значение xy для конструкторааргумент с именем accountId?

1 Ответ

0 голосов
/ 13 декабря 2018

Я вижу два подхода к Lamar.

Использование свойств

Хотя Lamar не предлагает With(), можно обойти эту проблему, чтобы сделать учетную запись свойствомВы устанавливаете метод фабрики, или чтобы фабрика просто получала все зависимости хранилища вручную из контейнера.В конце концов, это фабрика, поэтому ее тесная привязка к типу, который она производит, кажется хорошей с точки зрения дизайна.

Использование контекстов

Более приятный подход может бытьчтобы задать accountId в контексте и использовать контекст в хранилище:

public class ExecutionContext
{
    public Guid AccountId { get; set; } = Guid.NewGuid();
}

Репозиторий выглядит следующим образом

public class MyRepository
{
    public ExecutionContext Context { get; }

    public MyRepository(ExecutionContext context)
    {
        Context = context;
    }
}

Сделать контекст инъекционным ...

var container = new Container(_ =>
{
    _.Injectable<ExecutionContext>();
});

, а затем на вашем заводе ...

public MyRepository GetRepositoryForAccount(string accountId) {
    var nested = container.GetNestedContainer();
    var context = new ExecutionContext{ AccountId = accountId };
    nested.Inject(context);
    return nested.GetInstance<IMyRepository>()
}

Документация: https://jasperfx.github.io/lamar/documentation/ioc/injecting-at-runtime/

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

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