为了账号安全,请及时绑定邮箱和手机立即绑定

.Net Core 2.0 IServiceProvider渴望初始化

.Net Core 2.0 IServiceProvider渴望初始化

C#
杨魅力 2021-05-04 18:33:50
一点背景:在我当前的项目中,我尝试使用.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>()完成这些实例的初始化工作,但是我宁愿只写一次,而忘记这样做的方法。类似装配扫描。
查看完整描述

1 回答

?
RISEBY

TA贡献1856条经验 获得超5个赞

好的,我将回答我的想法。


我决定处理这个问题的方式是用空的界面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>。


查看完整回答
反对 回复 2021-05-21
  • 1 回答
  • 0 关注
  • 304 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信