Inject. NET Базовый объект как единичный экземпляр для каждого типа? - PullRequest
0 голосов
/ 07 марта 2020

Возможно ли использование. NET Внедрение зависимостей в ядро, чтобы различные типы разрешали свой собственный синглтон? Например, временный тип разрешает в своем конструкторе отдельный синглтон. Даже одноэлементный тип в их конструкторе будет преобразован в свой собственный отдельный одноэлементный. Это похоже на вставленный элемент stati c для типа класса.

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

В идеале, решение не должно было бы включать в себя знание всех типов, внедряемых в конструктор - например, HttpClientFactory не имеет этого требования.

Спасибо!

1 Ответ

0 голосов
/ 18 марта 2020

Если кто-то еще заинтересован в будущем, я решил это, используя дженерики. Например:

public interface IStaticMember<TOwner, TValue>
    where TOwner : class
    where TValue : class
{
    public TValue Value { get; }
}

Реализация:

public class StaticMember<TOwner, TValue> : IStaticMember<TOwner, TValue>
    where TOwner : class
    where TValue : class
{
    public StaticMember(TValue value)
    {
        Value = value;
    }

    public TValue Value { get; private set; }
}

Методы регистрации ...

public static IServiceCollection AddStaticMember<TOwner, TValue>(
    this IServiceCollection @this)
    where TOwner : class
    where TValue : class
{
    return @this.AddSingleton<IStaticMember<TOwner, TValue>, StaticMember<TOwner, TValue>>();
}

public static IServiceCollection AddStaticMember<TOwner, TValue>(
    this IServiceCollection @this,
    Func<IServiceProvider, TValue> valueFactory)
    where TOwner : class
    where TValue : class
{
    return @this.AddSingleton<IStaticMember<TOwner, TValue>>(serviceProvider =>
    {
        return new StaticMember<TOwner, TValue>(valueFactory(serviceProvider));
    });
}

Классы, которые его используют ...

public class OwningClass1 : IOwningClass1
{
    public OwningClass1(IStaticMember<IOwningClass1, IMyStatic> myStatic) { ... }
}

public class OwningClass2 : IOwningClass2
{
    public OwningClass2(IStaticMember<IOwningClass2, IMyStatic> myStatic) { ... }
}

И введение stati c в переходный процесс (двумя способами) ...

services.AddTransient<IOwningClass1, OwningClass1>();
services.AddTransient<IOwningClass2, OwningClass2>();
services.AddTransient<IMyStatic, MyStatic>();
services.AddStaticMember<IOwningClass1, IMyStatic>();
services.AddStaticMember<IOwningClass2, IMyStatic>();

// or

services.AddTransient<IOwningClass1, OwningClass1>();
services.AddTransient<IOwningClass2, OwningClass2>();
services.AddStaticMember<IOwningClass1, IMyStatic>(serviceCollection => new MyStatic());
services.AddStaticMember<IOwningClass2, IMyStatic>(serviceCollection => new MyStatic());

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

Пожалуйста, дайте мне знать, если есть лучший способ.

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