一点背景:
在我目前的项目中,我正在尝试使用.Net Core 2.0 DI系统进行依赖注入。我使用Scrutor进行程序集扫描,并将实现给定接口的所有类添加到IServiceCollection,以构建IServiceProvider。类似于github中的例子。
public static IServiceCollection AddSingletonsFromAssembly(this
IServiceCollection collection, Type type, Assembly assembly)
{
collection.Scan(x =>
{
x.FromAssemblies(assembly)
.AddClasses(classes => classes.AssignableTo(type))
.AsImplementedInterfaces()
.WithSingletonLifetime();
});
return collection;
}
我现在遇到的问题是任何其他服务都不需要我的某些服务,因此IServiceProvider从未初始化IServiceProvider懒惰地初始化单例。
有没有办法将IServiceProvider设置为急切初始化或迭代IServiceProvider中的服务以初始化它们?
我用一个空的通用接口填充集合,因此在这里不能使用GetServices,因为你没有空的泛型列表。
如果它们很小,我会接受其他依赖项。
注意:这是.Net Core Console App ...而不是ASP.NET Core
忘了提。我知道我可以通过快速IServiceProvider.GetService<T>()
来初始化这些实例,但我更喜欢写一次并忘记这样做。与装配扫描类似。
答案 0 :(得分:-1)
好的,我会回答我的想法。
我决定处理这个问题的方法是标记自己运行但没有被IEagerSingleton
空接口的任何其他服务使用的服务,并且不使用我使用的空泛型标记它们我的其他服务IService<T>
。
这使我仍然可以获得在其他地方使用的所有服务的依赖注入,同时能够急切地初始化我想要急切初始化的服务。基本思路如下。
public interface ISingleton<T>
{}
public interface IEagerSingleton
{}
public class Singleton : IEagerSingleton
{
}
//In a startup method somewhere
var collection = new
ServiceCollection().AddSingletonsFromAssembly(typeof(IEagerSingleton));
collection.AddSingletonsFromAssembly(typeof(ISingleton<>));
var provider = collection.BuildServiceProvider();
provider.GetServices<IEagerSingleton>();
这样做,我已经工作的注入仍然有效,现在依赖于来自ServiceProvider的注入但未被任何其他服务使用的服务得到了热切的初始化。此外,它仍然可以轻松维护。如果其他服务之一最终需要一个独立服务,我可以简单地将服务继承的接口交换为ISingleton<T>
。