快捷搜索:

项目实战,针对Options对象的借助注入

日期:2019-10-18编辑作者:www.8455.com

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

 

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

目录索引 

 

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

 

01

简介

 

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

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

  图片 1

  

 

 

 

以DI的方式使用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目录):

 

  图片 2

 

修改  读取文件配置(一) 的领域层 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)) 报错:图片 3

 

 

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

 

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

 

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

 

  我们来测试一下:

  图片 4

  图片 5

 

 

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

 

 

 

 

 

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

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

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

 

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

 

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

publicclassProfile:IEquatable<Profile>

{

publicGender Gender { get; set; }

publicintAge { get; set; }

publicContactInfo ContactInfo { get; set; }

publicProfile(){ }

publicProfile(Gender gender, intage, stringemailAddress, stringphoneNo)

{

Gender = gender;

Age = age;

ContactInfo = newContactInfo

{

EmailAddress = emailAddress,

PhoneNo = phoneNo

};

}

publicboolEquals(Profile other)

{

returnother == null

? false

: Gender == other.Gender &&

Age == other.Age &&

ContactInfo.Equals(other.ContactInfo);

}

}

publicclassContactInfo:IEquatable<ContactInfo>

{

publicstringEmailAddress { get; set; }

publicstringPhoneNo { get; set; }

publicboolEquals(ContactInfo other)

{

returnother == null

? false

: EmailAddress == other.EmailAddress &&

PhoneNo == other.PhoneNo;

}

}

publicenumGender

{

Male,

Female

}

在一个简单的控制台应用中定义了上面这些类型之后,我们来创建承载一个Profile对象的配置文件profile.json。如下所示的就是这个JSON文件的内容,它提供了一个构成一个完整Profile对象的所有数据。

{

"gender": "Male",

"age": "18",

"contactInfo": {

"emailAddress": "foobar@outlook.com",

"phoneNo": "123456789"

}

}

接下来我们需要为项目添加相关的NuGet包。由于我们采用基于JSON文件的配置,所以需要添加对应的NuGet包“Microsoft.Extensions.Configuration.Json”。由于Options模式本质上就是借助于依赖注入框架实现的一种编程模式,所以我们需要 “Microsoft.Extensions.DependencyInjection”这个NuGet包。

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

综上所述,我们需要为当前项目添加针对如下三个NuGet包的依赖:

  • Microsoft.Extensions.Configuration.Json
  • Microsoft.Extensions.DependencyInjection
  • Microsoft.Extensions.Options.ConfigurationExtensions

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

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

classProgram

{

staticvoidMain()

{

varconfiguration = newConfigurationBuilder()

.SetBasePath(Directory.GetCurrentDirectory())

.AddJsonFile( "profile.json")

本文由澳门新葡8455手机版发布于www.8455.com,转载请注明出处:项目实战,针对Options对象的借助注入

关键词: www.8455.com

外媒热议马云淡出阿里管理层

【环球时报综合报道】阿里巴巴集团灵魂人物马云于中国教师节这天宣布,一年后的阿里巴巴20周年之际,即2019年9月...

详细>>

互连网王国,互连网寻找引擎怎么样重塑世界

原标题:谷歌20年“征战史”:互联网搜索引擎如何重塑世界 原标题:20 年,缔造了 Google 互联网王国! style="font-s...

详细>>

快递业对用户的隐私数据管控,品牌企业如何做

原标题:八大领域RSTP四维评价:品牌企业如何做好消费者信息保护 近日“暗网”相继曝出A站、12306、摩拜、51Job等国...

详细>>

【www.8455.com】网站文章内容页的SEO排名技巧,重

责任编辑: 2、标题的主题一定要与文章内容相匹配,切不可挂羊头卖狗肉。 原标题:重庆简米网络科技:SEO的内容...

详细>>