.Net Core 2.0 IServiceProvider渴望初始化

一点背景:


在我当前的项目中,我尝试使用.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控制台应用程序...不是ASP.NET Core


忘了提。我知道我可以快速IServiceProvider.GetService<T>()完成这些实例的初始化工作,但是我宁愿只写一次,而忘记这样做的方法。类似装配扫描。


杨魅力
浏览 329回答 1
1回答

RISEBY

好的,我将回答我的想法。我决定处理这个问题的方式是用空的界面IEagerSingleton标记自己运行的,未被其他服务使用的服务,而不用我用于其他服务的空泛型标记它们IService<T>。这使我仍然能够获得在别处使用的所有服务的依赖项注入,同时能够热切初始化我想热切初始化的那些服务。下面的基本思想。public interface ISingleton<T>{}public interface IEagerSingleton{}public class Singleton : IEagerSingleton{}//In a startup method somewherevar collection = newServiceCollection().AddSingletonsFromAssembly(typeof(IEagerSingleton));collection.AddSingletonsFromAssembly(typeof(ISingleton<>));var provider = collection.BuildServiceProvider();provider.GetServices<IEagerSingleton>();这样,我已经运行的注入仍然可以正常工作,现在依赖于来自ServiceProvider注入但未被其他任何服务使用的服务会得到急切的初始化。另外,它仍然可以轻松维护。如果其他服务之一最终在以后需要其中一个独立服务,那么我可以简单地将服务继承的接口交换为ISingleton<T>。
打开App,查看更多内容
随时随地看视频慕课网APP