.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 条评论
登录 后参与评论

相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

.net配置文件的基础

.NET Core DI和子类

.NET Core DI调查IConfiguration

.NET Core中的DI问题

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

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