C# .Net Core 2.0 IServiceProvider初始化

C# .Net Core 2.0 IServiceProvider初始化,c#,.net-core,C#,.net Core,一点背景: 在我当前的项目中,我试图使用.NETCore2.0DI系统进行依赖注入。为了构建IServiceProvider,我正在使用它扫描程序集,并将实现给定接口的所有类添加到IServiceCollection。类似于github中的示例 public static IServiceCollection AddSingletonsFromAssembly(this IServiceCollection collection, Type type, Asse

一点背景:

在我当前的项目中,我试图使用.NETCore2.0DI系统进行依赖注入。为了构建IServiceProvider,我正在使用它扫描程序集,并将实现给定接口的所有类添加到IServiceCollection。类似于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核心控制台应用程序。。。不是ASP.NET核心


忘了提了。我知道我可以快速地
IServiceProvider.GetService()
初始化这些实例,但我更喜欢只写一次就忘记的方式。与组装扫描类似。

好的,我会用我的想法来回答

我决定处理这个问题的方法是,使用
IEagerSingleton
的空接口标记那些独立运行且未被任何其他服务使用的服务,并且不使用我用于我的其他服务
IService
的空泛型标记它们

这使我仍然能够获得其他地方使用的所有服务的依赖注入,同时能够急切地初始化我想要初始化的服务。基本思路如下

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>();
公共接口为单体
{}
公共接口单例
{}
公共类单例:iAgerSingleton
{
}
//在某个地方的启动方法中
var集合=新
ServiceCollection().AddSingletonsFromAssembly(typeof(IEagerSingleton));
collection.AddSingletonsFromAssembly(typeof(ISingleton));
var provider=collection.BuildServiceProvider();
GetServices();

这样做,我已经在工作的注入仍然可以工作,现在依赖于服务提供者的注入但不被任何其他服务使用的服务被急切地初始化。此外,它仍然可以轻松维护。如果其他服务最终需要一个独立服务,我可以简单地将服务继承的接口交换到一个
ISingleton

,如果没有任何服务需要这些服务,那么为什么需要初始化它们呢?它们更像是vent handler。。。他们使用其他服务来注册服务事件,但由于它目前所在的位置,除了将事件传递给他们之外,没有其他服务具有当前的用途。不过,我想你可能刚刚让我自己想出了一个答案。而不是将服务注入我的处理程序以添加到服务OneEvent Func。。我可能应该注入处理程序并在服务中设置它。不过,我仍然对一种很好的方式感兴趣,这种方式可以急切地初始化单例生命周期。