Asp.net core 简化IOPS方法<;T>;

Asp.net core 简化IOPS方法<;T>;,asp.net-core,dependency-injection,asp.net-core-2.1,.net-4.7.1,Asp.net Core,Dependency Injection,Asp.net Core 2.1,.net 4.7.1,我试图在使用内置DI机制的同时,获得一个与ASP.NET Core 2.1应用程序一致的.NET Framework类库。现在,我创建了一个配置类,并在appsettings.json中添加了相应的部分: services.Configure<MyConfig>(Configuration.GetSection("MyConfiguration")); services.AddScoped<MyService>(); services.Configure(Configu

我试图在使用内置DI机制的同时,获得一个与ASP.NET Core 2.1应用程序一致的.NET Framework类库。现在,我创建了一个配置类,并在appsettings.json中添加了相应的部分:

services.Configure<MyConfig>(Configuration.GetSection("MyConfiguration"));
services.AddScoped<MyService>();
services.Configure(Configuration.GetSection(“MyConfiguration”);
services.addScope();
在类库中:

public class MyService 
{
    private readonly MyConfig _config;

    public MyService(IOptions<MyConfig> config)
    {
        _config = config.Value;
    }
}
公共类MyService
{
私有只读MyConfig\u config;
公共MyService(IOptions配置)
{
_config=config.Value;
}
}
然而,为了构建这个类库,我必须添加
Microsoft.Extensions.Options
NuGet包。问题是,包中包含了大量依赖项,仅仅为了一个接口而添加这些依赖项似乎太多了


所以问题最终是,,“我是否可以采取另一种方法来配置位于.NET Framework类库中的依赖性不强的DI服务?

我不久前遇到了这个问题,如果您甚至可以称之为问题的话。我认为当我们看到这样的依赖列表时,我们都会有点震惊。但是正如@Tseng所提到的,包含一堆额外的小程序集(它们将被包含在
bin
中,因为在另一个项目中引用了这些程序集)并不是什么大问题。但是我承认,仅仅为了选项界面而包含它们是很烦人的

我是如何通过在
startup.cs
中解析服务依赖项并相应调整服务的构造函数来解决此问题的:

services.AddTransient<MyService>(Configuration.GetConfiguration("MyConfiguration"));
services.AddTransient(Configuration.GetConfiguration(“MyConfiguration”);

如果您不关心
IOptions
为您提供的任何内容,为什么不将
IConfiguration
注入您的服务中呢

公共类MyService
{
专用只读IConfiguration\u config;
公共MyService(IConfiguration配置)
{
_config=config;
}
公共无效剂量测定法()
{
var值=_config[“SomeKey”];
//做某事
}
}

查看这篇由菲利普·沃西斯金撰写的文章

您可以添加扩展方法:

public static class ServiceCollectionExtensions
{
    public static TConfig ConfigurePOCO<TConfig>(this IServiceCollection services, IConfiguration configuration) where TConfig : class, new()
    {
        if (services == null) throw new ArgumentNullException(nameof(services));
        if (configuration == null) throw new ArgumentNullException(nameof(configuration));

        var config = new TConfig();
        configuration.Bind(config);
        services.AddSingleton(config);
        return config;
    }
}

在不丢失MS配置的作用域/可重新加载功能的情况下?不可以。如果您对静态单例选项感到满意,您可以在IoC容器中注册options类。但是,当它发生变化时,您不会得到新的配置,也不会确定其范围(如果另一个请求修改它,它可能会在请求期间发生变化)。顺便说一句,依赖项本身并不是什么坏事。这就是.NET Core和.NET Standard的设计方式。在您拥有包含所有随附程序集的大型胖框架之前。在.NET Core/.NET标准中,它在包之间拆分,这就是您看到它的原因。另外,System.Memory包含了重要的优化,可以减少内存分配和内存碎片,所以这是一件好事:PWell这种语气不会给您带来任何进一步的影响。正如我所说,如果您不关心作用域选项保证和重新加载机制,您可以将
MyConfig
注入到您的服务中,而不是
IOptions
,并在ConfigureServices中进行额外注册:
services.AddScope(provider=>provider.GetRequiredService().Value)取而代之。但是.NET Core和.NET标准现在已经相当成熟,独立于平台,可以在很多企业场景中使用(除非您需要WCF或基于System.Web的东西),我们确实使用f/w,但asp.NET已经完全转移到Core。所以我们别无选择,要么放弃网络,要么使用核心。对于.NET:),MS不再提供TLC。而且核心还不成熟,它在小版本之间有突破性的变化。它远不是一个全面的、精心设计的产品。我们希望这就是为什么他们在明年推出3.0,也许有人最终意识到这种混乱会适得其反,并决定稳定局势。我们现在有两个来自同一家公司的相互竞争的.net产品,这一事实足以令人不安。事实上,这是由同一个人做的,嗯,有点精神分裂。我不得不问,因为我发现这很有趣,哪些依赖性是问题所在?我想说,注入
IConfiguration
比注入
IOption
更糟糕。它与配置值等效,因为它完全隐藏使用的配置值,而不是在te构造函数中显式声明它们。它使类负责读取和转换这些值,而不是应用程序的启动路径。我甚至会将
IConfiguration
(任何位于复合根目录之外的类)的注入称为反模式。我同意这一评论。另外,
IConfiguration
也是一个不必要的依赖项,它附带了其他内容。除了注入
IConfiguration
和可以放入类中的其他逻辑之外,问题是配置键。在结构简单的情况下,可以使用
var value=_config[“SomeKey”],但在更复杂的配置中,您可能会得到
var value=_config[“ParentKey:ChildKey:ChildKey”]我遇到的问题并不是对shell的震惊,而是这些库不仅仅是asp.net库,它们还由WPF项目共享,很多是由遗留WinForms共享的。将这些依赖项放在业务类中对我们来说毫无意义,因为它们将成为其他项目的依赖项。我觉得您完全同意。我喜欢使用可以被认为是最低可能分母的依赖项来构建我的服务。因此,为什么我喜欢将
MyConfiguration
直接注入
IOptions
。实际上,我通过在
ConfigureServices
中应用
Bind
解决了这个问题,但我看到了在
IServiceCollection
上进行扩展的吸引力和清晰性,我实际上将使用这种方法对其进行重构,所以我也会
public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    services.ConfigurePOCO<MySettings>(Configuration.GetSection("MySettings"));
}
public class DummyService
{
    public DummyService(MySettings settings)
    {
        //do stuff
    }
}