【发布时间】:2019-01-24 10:14:54
【问题描述】:
我试图在使用内置 DI 机制的同时获得与 ASP.NET Core 2.1 应用程序一致的 .NET Framework 类库。现在,我创建了一个配置类并将适当的部分添加到 appsettings.json:
services.Configure<MyConfig>(Configuration.GetSection("MyConfiguration"));
services.AddScoped<MyService>();
在类库中:
public class MyService
{
private readonly MyConfig _config;
public MyService(IOptions<MyConfig> config)
{
_config = config.Value;
}
}
但是,为了构建这个类库,我必须添加 Microsoft.Extensions.Options NuGet 包。问题是这个包携带了大量的依赖项,这些依赖项看起来相当多,只是为了一个接口而添加。
所以,最终的问题是,“我可以采取另一种方法来配置位于 .NET Framework 类库中的 DI 服务,它的依赖关系不重吗?
【问题讨论】:
-
不丢失 MS 配置的作用域/可重新加载功能?不会。如果您对静态单例选项感到满意,您可以将选项类注册到 IoC 容器。但是当它改变时你不会得到新的配置并且它不会被限定(如果另一个请求修改它,它可以在中间请求中改变)
-
依赖本身并不是什么坏事。它是 .NET Core 和 .NET Standard 的设计方式。在您拥有带有所有组件的大型胖框架之前。在 .NET Core/.NET Standard 中,它在包之间拆分,这就是您看到它的原因。 System.Memory 还包含重要的优化以减少内存分配和内存碎片,所以这是一件好事:P
-
好吧,这种语气不会让你更进一步。就像我说的,如果您不关心范围选项保证和重新加载机制,您可以将
MyConfig注入您的服务而不是IOptions<MyConfig>,并在ConfigureServices 中进行额外注册:services.AddScope<MyConfig>(provider => provider.GetRequiredService<IOptions<MyConfig>>().Value);。但是 .NET Core 和 .NET Standard 现在已经相当成熟,独立于平台,可以在很多企业场景中使用(除非你需要基于 WCF 或 System.Web 的东西) -
我们确实使用 f/w,但 asp.net 已完全移至核心。所以别无选择,我们要么放弃网络,要么使用核心。没有更多来自 MS 的 TLC 用于 .NET :)。而且核心还不成熟,小版本之间有重大变化。它远非一个圆润的、精心设计的产品。我们希望这就是他们在明年推出 3.0 的原因,也许有人最终意识到这种混乱会适得其反,并决定稳定局势。我们现在拥有来自同一家公司的两种相互竞争的 .net 产品这一事实就已经足够令人不安了。由同一个人完成的事实是,嗯,有点精神分裂。
-
我不得不问,因为我觉得这很有趣,哪些依赖是问题?
标签: asp.net-core dependency-injection asp.net-core-2.1 .net-4.7.1