如果其他人对未来感兴趣,我通过利用泛型解决了这个问题。例如:
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) { ... }
}
并将静态注入瞬态(两种方式)...
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 的所有实例都获得另一个不同的实例。
如果有更好的方法,请告诉我。