ASP. NET Ядро, как передать параметр в сервис-билдер - PullRequest
2 голосов
/ 13 марта 2020

Я прочитал очень полезную статью из блога Майкла МакКенны о создании мультитенантного приложения, но у меня есть пара проблем. Первый в классе TenantMiddleware как Constants.HttpContextTenantKey не определен, вероятно, из-за какого-то недостающего кода, тем временем я установил постоянную строку.

Основная проблема заключается в том, что я хотел бы передать массив tenants в классе InMemoryTenantStore при вызове службы при запуске. Я изменил InMemoryTenantStore class

 public class InMemoryTenantStore : ITenantStore<Tenant>
{
    private readonly Tenant[] _tenants;
    public InMemoryTenantStore(Tenant[] tenants)
    {
        _tenants = tenants;
    }

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

 public TenantBuilder<T> WithStore<V>(ServiceLifetime lifetime = ServiceLifetime.Transient) where V : class, ITenantStore<T>
    {
        _services.Add(ServiceDescriptor.Describe(typeof(ITenantStore<T>), typeof(V), lifetime));
        return this;
    }

Но я не могу найти никакого примера по этому поводу и, к сожалению, я не могу добраться до автора блога.

1 Ответ

1 голос
/ 13 марта 2020

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

Вы можете сделать это двумя способами:

  1. Просто создать экземпляр непосредственно перед WithStore методом.
  2. Создать фабрику реализации для сборки TenantBuilder (используя лямбду или отдельный метод)
// Creating instance outside
public TenantBuilder<T> WithStore<V>(V store, ServiceLifetime lifetime = ServiceLifetime.Transient) where V : class, ITenantStore<T>
{
    _services.Add(ServiceDescriptor.Describe(typeof(ITenantStore<T>), provider => store, lifetime));
    return this;
}

// Implementation factory
public TenantBuilder<T> WithStore<V>(Func<IServiceProvider, V> implementationFactory, ServiceLifetime lifetime = ServiceLifetime.Transient) where V : class, ITenantStore<T>
{
    _services.Add(ServiceDescriptor.Describe(typeof(ITenantStore<T>), implementationFactory, lifetime));
    return this;
}
...