NetCore基于依赖注入的封装

通常我们新建一个.Net 库项目,最后编译成dll,直接被其它项目引用,或提交到Nuget(包括私有的Nuget服务)上。使用方法通常是:

//1. 静态类方法
XXClass.method1();
//2. 实例化对象
XXClass xx = new XXClass();
xx.method1(); 

在NetCore使用一个第三方库很多情况都是类似系统库的使用:

//注入服务
services.AddXXX();
//使用服务
//在构造函数里直接使用接口
public YYY(IXXX xxx){
}

接下来看看我们怎么实现类似这样的库,使用方式和系统一致。
我们以一个对一个第三方发送短信的服务封装例子来看。

1.定义接口

发送短信很简单,接口如下

public interface IDoSMS
 {
       bool Send( string code, string mobile,string templateId);
 }

2. 注入服务

这一块最重要,实现也很简单,参考示例

namespace Microsoft.Extensions.DependencyInjection
{
    public static class DoSMSServiceCollectionExtensions
    {
        public static IServiceCollection AddUpassSMS(this IServiceCollection services,Action options=null)
        {
            if (options!=null)
                services.Configure(options);
            //singleton模式
            services.AddSingleton();
            return services;
        }
    }
}

这里一定注意namespace是Microsoft.Extensions.DependencyInjection,而不是自己的项目

3. 定义一个IOptions

主要是为了保持这个第三方需要用到的三个key值
最后需要appsettings.json里添加配置这个第三方需要的值.

  public class SMSUpassOptions : IOptions
  {
      public SMSUpassOptions Value => this;
      public string sid { get; set; }
      public string token { get; set; }
      public string appid { get; set; }
    }

4. 接口的实现

最后才是对上面定义的接口的真正实现类DoSMSUpass 。这里不列了,实现很简单,第三方提供了webapi调用

5. 提交到私有的Nuget服务

私有Nuget服务的搭建方法可以参考文档,这个文档里提交到Nuget服务上需要单独设置配置文件,其实visualstudio已经带了图形化界面来设置,如下截图:

image.png

6. 引用库

通过Nuget管理添加这个库之后使用就很方便了。

  1. 注册服务
public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    
    services.Configure(Configuration.GetSection("UpassSMS"));
    services.AddUpassSMS();
}
  1. appsettings.json里添加配置
{
  "UpassSMS": {
    "sid": "053308d468f",
    "token": "3b7ea335dff397",
    "appid": "113f01e3a7ba3b1"
  }
}

  1. 使用服务
public class ValuesController : Controller
{
    IDoSMS sms;
    public ValuesController(IDoSMS _sms)
    {
        sms = _sms;
    }
    // GET api/values
    [HttpGet]
    public ActionResult> Get()
    {
        //88928是验证码
        //18511111234是手机号
        //368230是模板id,每个项目需要申请一个模板id
        bool b = sms.Send("88928", "18511111234", "4820");
        return new string[] { "value1", "value2"+b };
    }
 }

最终实现这种封装方式,使用非常简单。
所有源码参考github

你可能感兴趣的:(NetCore基于依赖注入的封装)