通常我们新建一个.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<SMSUpassOptions> options=null)
{
if (options!=null)
services.Configure<SMSUpassOptions>(options);
//singleton模式
services.AddSingleton<IDoSMS, DoSMSUpass>();
return services;
}
}
}
这里一定注意namespace是Microsoft.Extensions.DependencyInjection,而不是自己的项目
3. 定义一个IOptions
主要是为了保持这个第三方需要用到的三个key值
最后需要appsettings.json里添加配置这个第三方需要的值.
public class SMSUpassOptions : IOptions<SMSUpassOptions>
{
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已经带了图形化界面来设置,如下截图:

6. 引用库
通过Nuget管理添加这个库之后使用就很方便了。
- 注册服务
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.Configure<SMSUpassOptions>(Configuration.GetSection("UpassSMS"));
services.AddUpassSMS();
}
- appsettings.json里添加配置
{
"UpassSMS": {
"sid": "053308d468f",
"token": "3b7ea335dff397",
"appid": "113f01e3a7ba3b1"
}
}
- 使用服务
public class ValuesController : Controller
{
IDoSMS sms;
public ValuesController(IDoSMS _sms)
{
sms = _sms;
}
// GET api/values
[HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
//88928是验证码
//18511111234是手机号
//368230是模板id,每个项目需要申请一个模板id
bool b = sms.Send("88928", "18511111234", "4820");
return new string[] { "value1", "value2"+b };
}
}
最终实现这种封装方式,使用非常简单。
所有源码参考github
网友评论