品类实战,针对Options对象的依据注入

{

解决问题

 

 
带着上面的两个问题,我们首先来添加一个配置文件
siteconfig.json

  

  {

    ”SiteBaseConfig”: {

      //文件上传路径

      ”FileUpPath”: “/upload/”,

      //是否启用单用户登录

      ”IsSingleLogin”: “True”,

      //允许上传的文件格式

      ”AttachExtension”:
“gif,jpg,jpeg,png,bmp,rar,zip,doc,docx,xls,xlsx,ppt,pptx,txt,flv,apk,mp4,mpg,ts,mpeg,mp3,bak,pdf”,

      //图片上传最大值KB

      ”AttachImagesize”: 12400

    }
  }

 

我们在
读取文件配置(一)中的配置类 ApplicationConfiguration

 

 1 public class ApplicationConfiguration
 2     {
 3         #region 属性成员
 4 
 5         /// <summary>
 6         /// 文件上传路径
 7         /// </summary>
 8         public string FileUpPath { get; set; }
 9         /// <summary>
10         /// 是否启用单用户登录
11         /// </summary>
12         public bool IsSingleLogin { get; set; }
13         /// <summary>
14         /// 允许上传的文件格式
15         /// </summary>
16         public string AttachExtension { get; set; }
17         /// <summary>
18         /// 图片上传最大值KB
19         /// </summary>
20         public int AttachImagesize { get; set; }
21         #endregion
22     }

 

 

  在
project.json 的 buildOptions 添加 “copyToOutput”:
“siteconfig.json”,让该文件在编译的时候自动拷贝到输出目录下(默认为bin目录):

 

  图片 1

 

修改  读取文件配置(一) 的领域层 AppConfigurtaionServices

 

  public
class AppConfigurtaionServices
  {

    

    public
T GetAppSettings<T>(string key)where T:class,new()

    {

      IConfiguration config = new ConfigurationBuilder()

                  .Add(new JsonConfigurationSource {
Path= “siteconfig.json”, ReloadOnChange=true })

                  .Build();

 

      var appconfig= new ServiceCollection()

              .AddOptions()

              .Configure<T>(config.GetSection(key))

              .BuildServiceProvider()

              .GetService<IOptions<T>>()

              .Value;

 

      return appconfig;

    }

 

  }  

  

  说明:我们首先创建了一个ConfigurationBuilder对象,并在它上面注册了一个JsonConfigurationSource。在创建这个JsonConfigurationSource对象的时候,除了指定配置文件(“siteconfig.json”)的路径之外,我们还将它的 ReloadOnChange 属性设置为True。这个ReloadOnChange属性的含义就是当原始配置文件的内容发生改变的时候是否需要重新加载配置。

 

  这时候我们会发现 Configure<T>(config.GetSection(key))
报错:图片 2

 

 

  我查看了我们之前在Startup中的
services.Configure<T>()
发现,这个里面的参数是有两个重载的 一个是
IConfiguration 一个是
System.Action<T>,那么为什么这里重载不出来了呢?

 

   十分不解,最后发现是少了扩展类 Microsoft.Extensions.Options.ConfigurationExtensions

 

  我们通过 NuGet
添加这个
Install-Package Microsoft.Extensions.Options.ConfigurationExtensions
 问题得到解决,在此感谢 @Artech

 

  我们来测试一下:

  图片 3

  图片 4

 

 

  OK,这样,我们在文章开始提出的两个问题就都得到了解决!

 

 

 

 

 

希望跟大家一起学习Asp.net
Core 

刚开始接触,水平有限,很多东西都是自己的理解和翻阅网上大神的资料,如果有不对的地方和不理解的地方,希望大家指正!

虽然Asp.net Core
现在很火热,但是网上的很多资料都是前篇一律的复制,所以有很多问题我也暂时没有解决,希望大家能共同帮助一下!

 

原创文章
转载请尊重劳动成果 http://yuangang.cnblogs.com

 

以DI的方式使用Options

 

责任编辑:

目录索引 

 

【无私分享:ASP.NET
CORE
项目实战】目录索引

 

.Configure<Profile>( “bar”, configuration.GetSection( “bar”))

简介

 

  我们在 读取配置文件(一)
appsettings.json 中介绍了,如何读取appsettings.json.

  但随之产生了问题:我们使用的是在
Startup.cs
中(如下图)来实现配置读取,有两个问题 ①
我们如果定义N种配置,是否要再这里添加N条这样的配置 ; ②
如果我们的配置不想写在appsettings.json中呢 

  图片 5

  

 

 

 

接下来我们编写了如下的代码来演示如何采用Options模式来获取由配置文件提供的数据绑定生成的Options对象。我们调用扩展方法AddJsonFile将针对配置文件(“profile.json”)的配置源注册到创建的ConfigurationBuilder对象上,然后利用后者创建出对应的IConfigurataion对象。

publicContactInfo ContactInfo { get; set; }

PhoneNo == other.PhoneNo;

图片 6

},

我们可以利用配置绑定功能将承载一组相关配置数据的IConfiguration对象转换成一个具有兼容数据结构的POCO(Plain
Old CLR
Object)对象,进而实现“面向对象”的配置编程,而系列介绍的“Options模式(Pattern)”则在此基础上更进了一步,它使我们可以采用依赖注入的方式直接使用绑定的这个POCO对象,我们称这个POCO对象为Options对象。除此之外,Options模式也可以直接脱离配置系统,使我们可以直接采用编程的方式来初始化Options对象。

Console.WriteLine( $”Gender: {profile.Gender}”);

}

“age”: “18”,

“phoneNo”: “123456789”

.BuildServiceProvider()

“contactInfo”: {

{

接下来我们创建一个ServiceCollection对象,在调用扩展方法AddOptions注册Options编程模式的核心服务后,我们将创建的IConfiguration对象作为参数调用另一个扩展方法Configure<Profile>。Configure<Profile>方法相当于将提供的IConfiguration与Options类型(Profile)做了一个映射,在需要提供对应Options对象的时候,
映射的IConfiguration对象会被提取出来并绑定为提供的Options对象。

我们将这个Profile对象承载的相关数据直接打印在控制台上。这个程序执行之后,会在控制台上生成如图1所示的输出结果,可见我们通过Options模式得到Profile对象承载的数据完全来源于配置文件。

publicboolEquals(Profile other)

“gender”: “Female”,

}

publicenumGender

Options模式的核心接口IOptions<TOptions>和其他核心类型定义在“Microsoft.Extensions.Options”这个NuGet包中,而NuGet“Microsoft.Extensions.Options.ConfigurationExtensions”实现了针对配置模型的集成,但是由于后者依赖前者,所以我们只需要添加针对后者的依赖就可以了。

.BuildServiceProvider();

{

具名Options的注册和提取体现在如下所示的代码片段中。我们从这段代码片段中可以看出,在调用IServiceCollection接口的扩展方法Configure<Profile>的时候,我们给注册的映射关系起了一个名字(“foo”和“bar”),指定的IConfiguration对象也由原来的ConfigurationRoot对象变成它的两个子配置节。

.AddJsonFile( “profile.json”)

Female

.AddJsonFile( “profile.json”)

“emailAddress”: “bar@outlook.com”,

{

“phoneNo”: “456”

Console.WriteLine( $”Email Address:
{profile.ContactInfo.EmailAddress}”);

publicGender Gender { get; set; }

“emailAddress”: “foobar@outlook.com”,

.AddOptions()

{

“emailAddress”: “foo@outlook.com”,

{

“contactInfo”: {

: EmailAddress == other.EmailAddress &&

}

publicProfile(Gender gender, intage, stringemailAddress, stringphoneNo)

所谓的Options模式,其本质就是利用预先注册的一些服务来提供承载配置数据的Options对象,这些原始的数据可能来源于配置系统提供的IConfiguration对象,也可能是我们在应用启动过程中自动创建并初始化的。我们先来演示采用配置系统作为Options对象数据源的场景。简单起见,我们依然沿用《配置》系列定义的Profile作为基础的Options类型,如下是相关类型的定义。

Age = age;

classProgram

.Build();

Console.WriteLine( $”Age: {profile.Age}”);

承载配置数据的Options对象最终是通过IOptions<TOptions>接口表示的服务来提供的,这个接口的泛型参数TOptions表示的正是Options对象的类型。在得到作为DI容器的IServiceProvider对象之后,我们直接调用其扩展方法GetRequiredService的来提供这个IOptions<Profile>对象,该对象Value属性返回的就是通过绑定配置数据生成的Profile对象。

Console.WriteLine( $”Email Address:
{profile.ContactInfo.EmailAddress}”);

{

原标题:[.NET Core的Options模式] 针对Options对象的依赖注入[上篇]

“contactInfo”: {

}

02

publicintAge { get; set; }

就我们演示实例中用来表示个人信息的Profile类型来说,应用程序中可能会使用它来表示不同用户的信息,比如张三、李四和王五。为了解决这个问题,我们可以在添加IConfiguration对象与Options类型映射关系的时候赋予它们一个唯一标识,这个标识最终被用于针对性的提取对应的Options对象。这种具名的Options对象由另一个名为IOptionsSnapshot<TOptions>的接口表示的服务来提供。

}

为了针对指定的用户名来提取对应的Profile对象,我们利用作为DI容器的ServiceProvider得到通过IOptionsSnapshot<TOptions>接口表示的服务对象,并将用户名作为参数调用其Get方法得到对应的Profile对象。程序运行后,针对两个不同用户的基本信息将以如图2所示的形式输出到控制台上。

returnother == null

Console.WriteLine( $”Gender: {profile.Gender}”);

varoptionsAccessor =
serviceProvider.GetRequiredService<IOptionsSnapshot<Profile>>();

ContactInfo = newContactInfo

.AddOptions()

01

“age”: “25”,

};

? false

相关文章