asp.Net   发布时间:2022-04-07  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了看看.NET Core几个Options的简单使用大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

<h2 id="前言">前言

配置,对我们的程序来说是十分重要的一部分。或多或少都会写一部分内容到配置文件中去。

由其是在配置中心(Apollo等)做起来之前,配置文件一定会是我们的首选。

在.NET Core中,习惯的是用json文件当配置文件。读取的方法是不少,这里主要介绍的是用基于Options的方法来读,可以认为这是一种强类型的形式。

本文会介绍一些常见的用法,简单的单元测试示例,如果想探讨内部实现,请移步至https://www.cnblogs.com/RainingNight/">雨夜朦胧的博客。

先来看看IOptions。

先写好配置文件

{
    "Demo": {
        "Age": 18,"Name": "catcher"
    },//others ... 
}

然后定义对应的实体类

public class DemoOptions
{
    public int age { get; set; }
public String Name { get; set; }

}

然后只需要在Configureservices方法添加一行代码就可以正常使用了。

public void Configureservices(IserviceCollection services)
{
    services.Configure(Configuration.GetSection("Demo"));
//others..

}

最后就是在想要读配置内容的地方使用IOptions去注入就好了。

private readonly DemoOptions _normal;

public ValuesController(IOptions normalAcC)
{
this._normal = normalAcc.Value;
}

// GET api/values
[httpGet]
public String Get()
{
var age = $"normal-[{_normal.AgE}];";
var name = $"normal-[{_normal.NamE}];";

return $"age:{agE} \nname:{name}";

}

这个时候的结果,就会大致如下了:

@H_618_72@@H_618_72@675_10283@e="看看.NET Core几个Options的简单使用" alt="看看.NET Core几个Options的简单使用" src="https://cn.js-code.com/res/2019/02-08/23/fe8d899a6ebd87c902a0634d063e48db.png">

这个时候可能会冒出这样的一个想法,如果某天,要修改某个配置项的值,它能及时生效吗?

口说无凭,来个动图见证一下。

@H_618_72@@H_618_72@675_10283@e="看看.NET Core几个Options的简单使用" alt="看看.NET Core几个Options的简单使用" src="https://cn.js-code.com/res/2019/02-08/23/97d14029c5b93aec72fe5759368c9df3.gif">

事实证明,使用IOptions的时候,修改配置文件的值,并不会立刻生效!!

既然IOptions不行,那么我们就换一个!

下面来看看IOptionsSnapshot。

对于Options家族,在Startup注册的时候都是一个样的,区别在于使用它们的时候。

private readonly DemoOptions _normal;
private readonly DemoOptions _snapshot;

public ValuesController(IOptions normalAcc,IOptionsSnapshot snapshotAcC)
{
this._normal = normalAcc.Value;
this._snapshot = snapshotAcc.Value;
}

// GET api/values
[httpGet]
public String Get()
{
var age = $"normal-[{_normal.AgE}];snapshot-[{_snapshot.AgE}];";
var name = $"normal-[{_normal.NamE}];snapshot-[{_snapshot.NamE}];";

return $"age:{agE} \nname:{name}";

}

这个时候修改配置项的值之后,就会立马更新了。

@H_618_72@@H_618_72@675_10283@e="看看.NET Core几个Options的简单使用" alt="看看.NET Core几个Options的简单使用" src="https://cn.js-code.com/res/2019/02-08/23/705007e605852d513724a13010b919b9.gif">

本质上,IOptions和IOptionsSnapshot是一样的,只是他们注册的生命周期不一样,从而就有不同的表现结果。

当然,还有一个更强大的Options的存在,IOptionsMonitor。

它的用法和IOptionsSnapshot没有区别,不同的时,它多了一个配置文件发生改变之后事件处理。

下面来看看。

private readonly DemoOptions _normal;
private readonly DemoOptions _snapshot;
private readonly DemoOptions _monitor;

public ValuesController(IOptions normalAcc,IOptionsSnapshot snapshotAcc,IOptionsMonitor monitOracC)
{
this._normal = normalAcc.Value;
this._snapshot = snapshotAcc.Value;
this._monitor = monitOracc.CurrentValue;
monitOracc.onChange(ChangeListener);
}

private void ChangeListener(DemoOptions options,String Name)
{
Console.WriteLine(Name);
}

// GET api/values
[httpGet]
public String Get()
{
var age = $"normal-[{_normal.AgE}];snapshot-[{_snapshot.AgE}];monitor-[{_monitor.AgE}];";
var name = $"normal-[{_normal.NamE}];snapshot-[{_snapshot.NamE}];monitor-[{_monitor.NamE}];";

return $"age:{agE} \nname:{name}";

}

效果和上面一样的,不同的是,当保存appsetTings.json的时候,会触发一次ChangeListener

说Snapshot和Monitor可以让我们及时获取到最新的配置项。

但是我们也可以通过PostConfigurePostConfigureAll来进行调整。

public void Configureservices(IserviceCollection services)
{
    services.Configure(Configuration.GetSection("Demo"));
services.PostConfigureAll<DemoOptions>(x =>
{
    x.Age = 100;
});

services.AddMvc();

}

如果我们的代码是这样写的,那么,最终的结果就会是,无论我们怎么修改配置文件,最终展示的Age会一直是100。

大家也可以思一下这个可以用在什么场景。

便给大家看一段Steeltoe服务发现客户端的代码

private static void AddDiscoveryservices(IserviceCollection services,IConfiguration config,IDiscoveryLifecycle lifecyclE)
{
    var clientConfigsection = config.GetSection(EUREKA_PREFIX);
    int childCount = clientConfigsection.GetChildren().Count();
    if (childCount > 0)
    {
        var clientSection = config.GetSection(EurekaClientOptions.EUREKA_CLIENT_CONFIGURATION_PREFIX);
        services.Configure(clientSection);
    var instSection = config.GetSection(EureKainstanceOptions.EUREKA_INSTANCE_CONFIGURATION_PREFIX);
    services.Configure<EureKainstanceOptions>(instSection);
    services.PostConfigure<EureKainstanceOptions>((options) =>
    {
        EurekaPostConfigurer.updateConfiguration(config,options);
    });
    AddEurekaservices(services,lifecyclE);
}
else
{
    throw new Argumentexception("Discovery client type UNKNOWN,check configuration");
}

}

最后就是单元测试遇到Options要怎么处理的问题了。

单元测试,这里用了NSubstitute来作示例。

先简单定义一些类

public class MyClass
{
    private readonly MyOptions _options;
public MyClass(IOptions<MyOptions> optionsAcC)
{
    this._options = optionsAcc.Value;
}

public String Greet()
{
    return $"Hello,{_options.NamE}";
}

}

public class MyOptions
{
public String Name { get; set; }
}

编写测试类

public class MyClassTest
{
    private readonly MyClass myClass;
public MyClassTest()
{
    var options = new MyOptions {  Name = "catcher"};

    var fake = Substitute.For<IOptions<MyOptions>>();

    fake.Value.Returns(options);

    myClass = new MyClass(fakE);
}

[Fact]
public void GreetTest()
{
    var res = myClass.Greet();

    Assert.Equal("Hello,catcher",res);
}

}

重点在于fake了一下Options(这里只以IOptions为例),然后是告诉测试,如果有用到Value属性的时候,就用返回定义好的Options。

也是比较简单的做法,测试的结果自然也是符合预期的。

@H_618_72@@H_618_72@675_10283@e="看看.NET Core几个Options的简单使用" alt="看看.NET Core几个Options的简单使用" src="https://cn.js-code.com/res/2019/02-08/23/07624ffcc20adfa974349179306735f9.png">

这几个Options使用起来还是比较顺手的,至少何时采用那种Options,就得根据场景来定了。

大佬总结

以上是大佬教程为你收集整理的看看.NET Core几个Options的简单使用全部内容,希望文章能够帮你解决看看.NET Core几个Options的简单使用所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: