.Net Core 2.0 IServiceProvider急切初始化

时间:2018-05-01 01:42:27

标签: c# .net-core

一点背景:

在我目前的项目中,我正在尝试使用.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>()来初始化这些实例,但我更喜欢写一次并忘记这样做。与装配扫描类似。

1 个答案:

答案 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>

相关问题