.net core 将.NET核心对象作为每种类型的单例实例注入?

.net core 将.NET核心对象作为每种类型的单例实例注入?,.net-core,dependency-injection,.net Core,Dependency Injection,使用.NET核心依赖项注入有可能让不同的类型解析它们自己的单例吗?例如,一个瞬态类型在其构造函数中解析一个不同的单例。即使是构造函数中的单例类型也会解析为它自己独特的单例。它类似于类类型上的注入静态成员 HttpClientFactory可以通过HttpClient实现这一点。HttpClient是一次性的,但底层消息处理程序是所有者的终身控制对象。我怎样才能复制它呢 理想情况下,解决方案不需要我知道所有被注入构造函数的类型——例如,HttpClientFactory没有这个要求 谢谢 如果有人

使用.NET核心依赖项注入有可能让不同的类型解析它们自己的单例吗?例如,一个瞬态类型在其构造函数中解析一个不同的单例。即使是构造函数中的单例类型也会解析为它自己独特的单例。它类似于类类型上的注入静态成员

HttpClientFactory可以通过HttpClient实现这一点。HttpClient是一次性的,但底层消息处理程序是所有者的终身控制对象。我怎样才能复制它呢

理想情况下,解决方案不需要我知道所有被注入构造函数的类型——例如,HttpClientFactory没有这个要求


谢谢

如果有人对未来感兴趣,我通过利用泛型解决了这个问题。例如:

public interface IStaticMember<TOwner, TValue>
    where TOwner : class
    where TValue : class
{
    public TValue Value { get; }
}
公共接口IStaticMember
城里人:班级
其中TValue:类
{
公共TValue值{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; }
}
公共类StaticMember:IStaticMember
城里人:班级
其中TValue:类
{
公共静态成员(TValue值)
{
价值=价值;
}
公共TValue值{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));
    });
}
公共静态IServiceCollection AddStaticMember(
此IServiceCollection@this)
城里人:班级
其中TValue:类
{
return@this.AddSingleton();
}
公共静态IServiceCollection AddStaticMember(
这是IServiceCollection@this,
Func(工厂)
城里人:班级
其中TValue:类
{
return@this.AddSingleton(serviceProvider=>
{
返回新的StaticMember(valueFactory(serviceProvider));
});
}
使用它的类

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

public class OwningClass2 : IOwningClass2
{
    public OwningClass2(IStaticMember<IOwningClass2, IMyStatic> myStatic) { ... }
}
公共类OwningClass1:loowningclass1
{
公有制类别1(IStaticMember myStatic){…}
}
公共类OwningClass2:LowningClass2
{
公有类2(IStaticMember myStatic){…}
}
将静电注入瞬态(两种方式)

services.AddTransient();
services.AddTransient();
services.AddTransient();
services.AddStaticMember();
services.AddStaticMember();
//或
services.AddTransient();
services.AddTransient();
AddStaticMember(serviceCollection=>newmystatic());
AddStaticMember(serviceCollection=>newmystatic());
在这两种情况下,OwningClass1的所有实例都获得相同的实例,而OwningClass2的所有实例都获得另一个不同的实例


请告诉我是否有更好的方法。

您能更新您的问题并描述您试图解决的潜在问题吗?
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());