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