.NET Core 2,DI,配置文件

罗洛

我正在研究.NET Core 2,但我不喜欢如何管理DI ...在网络上,我读到以下内容:

  1. 创建类似IService的界面

  2. 为IService创建一个实现

  3. 在.NET Core容器的范围内将其添加到解决依赖关系的Startup.Configuration方法中。

  4. 最后,我可以将其用于自定义控制器的构造函数中。

在.NET classic中,我使用了专用的XML配置文件来管理依赖关系:是否可以使用配置文件(JSON或XML相同)来执行与Startup.Configuration方法相同的操作?

...否则有人可以向我解释为什么将服务配置为Startup.Configuration是更好的方法?

非常感谢...

戴维

首先,要回答您的问题“我可以使用配置文件”吗,答案是肯定的“是”。您为什么不稍后再回答,但是现在,这是一个穷人版本,您可以通过添加到appsettings.json文件中来做到这一点请注意,这个代码是不是最优的,而是为了告诉你如何能够实现这个解决方案。

让我们从一些类开始以保存数据:

public class ServicesConfiguration
{
    public IEnumerable<ServiceItem> Singleton { get; set; }
    public IEnumerable<ServiceItem> Transient { get; set; }
}

public class ServiceItem
{
    public string Service { get; set; }
    public string Implementation { get; set; }
}

现在在您的JSON文件中添加一个部分,您甚至可能希望将此文件保留在主配置外部,但这是实现细节,我将留给您:

{
    //snip main config....

    "Services" : {
        "Singleton": [
            { 
                "Service": "YourNamespace.IFoo1, YourNamespace", 
                "Implementation": "YourNamespace.Foo1, YourNamespace" 
            },   
            {
                "Service": "YourNamespace.IFoo2, YourNamespace", 
                "Implementation": "YourNamespace.Foo2, YourNamespace" 
            }  
        ],
        "Transient": [
            {
                "Service": "YourNamespace.IBar1, YourNamespace",
                "Implementation": "YourNamespace.Bar1, YourNamespace"
            }    
        ]
    }
}

现在是一种扩展方法来配置所有功能:

public static IServiceCollection AddFromConfigurationFile(this IServiceCollection services, 
    IConfigurationSection configuration)
{
    var servicesConfiguration = configuration.Get<ServicesConfiguration>();

    foreach(var service in servicesConfiguration.Singleton)
    {
        services.AddSingleton(Type.GetType(service.Service), Type.GetType(service.Implementation));
    }

    foreach(var service in servicesConfiguration.Transient)
    {
        services.AddTransient(Type.GetType(service.Service), Type.GetType(service.Implementation));
    }

    //Other scopes here...

    return services;
}

并这样调用它ConifigureServices

services.AddFromConfigurationFile(Configuration.GetSection("Services"));

那么,简单好吧?你为什么不这样做呢?我想到了几个主意:

  1. 为什么要更改几乎所有DI实现的工作方式?如果没有破裂,为什么要修复它?仅仅因为您习惯于一种特定的方法,并不意味着它是一个好主意。
  2. 类型安全性:您丢失了在配置文件中指定的类型的编译时检查。
  3. 安全性:将其保存在配置文件中将使某人将实现更改为自己选择的类。

我确定还有更多,但这是您的应用!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

ASP.NET Core:“该项目不知道如何运行配置文件Docker。” 在Visual Studio 2017上

带有ASP.NET Core的Azure AD B2C-无法去编辑配置文件

以编程方式清除ASP.NET Core中的缓存配置文件

流利的迁移:在Process .net core中运行迁移时如何指定配置文件

运行.NET Core API Linux环境启动配置文件

如何使用.NET Core根据发布配置文件更新appsettings.json?

AWS .NET Core单元测试加载非默认配置文件

带有UDP的net.core的log4net配置文件动态附加远程地址

在ASP.NET Core中的项目之间共享配置文件

具有实体框架的ASP.NET Core 2,在应用程序配置文件中找不到名为“ ####”的连接字符串

如何从.net Core 2.2中的log4net配置文件获取添加程序

配置文件中的ASP.NET Core基本URL

如何从.net core 2.0 Web应用程序中的配置文件获取.net core标准类库中的连接字符串?

Facebook OAuth登录未在ASP.NET Core 2.2中获取用户配置文件

.NET Core DI调查IConfiguration

如何以跨平台方式在ASP.NET Core中的.json配置文件中存储文件路径?

在F#、. Net Core中,项目不知道如何运行配置文件IIS Express

.NET Core DI和子类

如何从ASP.Net Core配置文件合并多个阵列?

.NET Core中的DI问题

.net配置文件的基础

.NET Core 中使用字符串(配置文件)的 ServiceCollection 配置

通过 Asp.Net Core 依赖注入添加 AutoMapper 并注入到配置文件中

.NET Core 配置文件的工作原理

asp.net core 2.0 Entity Framework 如何访问用户配置文件

带有 UDP 动态附加远程端口的 net.core 的 log4net 配置文件

当配置文件在子文件夹中时,如何在 ASP.NET Core Middleware 中获取配置?

.NET Core 中的每个文件的密钥配置

带有 IIsExpress 配置文件的 ASP.NET Core 6 文件太大 (413)