Skip to content

DMS是一个集中式的中间件框架,每一个小型中间件将会是完全独立的,都将以注册方式使用,主要为了快速开发项目而准备,如:DMS.Autofac,DMS.Consul,DMS.RabbitMQg,DMS.Swagger,GRPC,Thrift,Netty,DMS.Exceptionless,DMS.Log4net,DMS.NLogs,DMS.Consul,Ocelot,IdentityServer,Zookeeper等,Demo中会有每一个中间件的实例方便开发者了解

hailang2ll/DMS

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

DMS

DMS是一个集中式的中间件框架,每一个小型中间件将会是完全独立的,都将以注册方式使用,主要为了快速开发项目而准备,如:DMS.Autofac,DMS.Consul,DMS.RabbitMQg,DMS.Swagger,GRPC,Thrift,Netty,DMS.Exceptionless,DMS.Log4net,DMS.NLogs,DMS.Consul,Ocelot,IdentityServer,Zookeeper等,Demo中会有每一个中间件的实例方便开发者了解

qq交流群:18362376
作者微信:hailang2ll

运营公众号

DMS.Autofac 依赖与注入

基于Autofac框架,支持多种方式注入(构造函数注入,属性注入)

1.示例调用

需要先引用Nuget包,安装DMS.Autofac 在Startup类的ConfigureServices方法中添加:

种:默认查找当前接口类与实现类,规则如:DMS.EntityFrameworkCore.Contracts,DMS.EntityFrameworkCore.Service,后缀.Contracts,.Service结尾,排除不必要的注册类,加快注册速度
第二种:实现类继承统一接口IAutoInject,规则如:实现类DMS.EntityFrameworkCore.Service下的都需要继承IAutoInject,后缀.Service结尾,排除不必要的注册类,加快注册速度
第三种:全局扫描以Service结尾的类,自动注入
第四种:模块化注入,自定义模块实现注入,如:AutofacModule
public IServiceProvider ConfigureServices(IServiceCollection services)
{

    services.AddMvc().AddJsonOptions(options =>
    {
        options.SerializerSettings.DateFormatString = "yyyy-MM-dd";
        options.SerializerSettings.ContractResolver = new DefaultContractResolver();
        options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
        options.SerializerSettings.MissingMemberHandling = MissingMemberHandling.Ignore;
        options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
    });
    services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
    services.AddSwaggerGenV2();

    #region AddDbContext
    var connectionStrings = Configuration.GetConnectionString("trydou_sys");
    services.AddDbContext<trydou_sysContext>(options => options.UseSqlServer(connectionStrings));
    #endregion

    return AutofacService.RegisterAutofac(services);
}

DMS.RabbitMQ 基于RabbitMQ.Client框架开发,依赖DMS中基础框架,主要用于分布式消息对列系统

首先定义你的数据实体文件RabbitMQ.json,参考开源中的JSON文件

public class RabbitMQConfig
{

        /// <summary>
        /// MQ服务器
        /// </summary>
        public string HostName { get; set; }

        /// <summary>
        /// 用户名
        /// </summary>
        public string UserName { get; set; }

        /// <summary>
        /// 密码
        /// </summary>
        public string Password { get; set; }

        /// <summary>
        /// 虚拟主机
        /// </summary>
        public string VirtualHost { get; set; }

        /// <summary>
        /// 端口
        /// </summary>
        public int Port { get; set; }

        /// <summary>
        /// 心跳数
        /// </summary>
        public ushort RequestedHeartbeat { get; set; }

        /// <summary>
        /// 自动重新连接
        /// </summary>
        public bool AutomaticRecoveryEnabled { get; set; }

        /// <summary>
        ///是否发送
        /// </summary>
        public bool IsSend { get; set; }
}

服务端调用方法

 static IHost CreateDefaultHost(string[] args) => new HostBuilder()
//.UseLog4net("Config\\log4net.config")
.UseRabbitMQ("Config\\rabbitmq.json")
.UseBusinessHost()//启用业务主机
.UseAuditHost()//启用审计队列
.Build();

客户端调用方法

static IHost CreateDefaultHost(string[] args) => new HostBuilder()
//.UseLog4net("Config\\log4net.config")
.UseRabbitMQ("Config\\rabbitmq.json")
.ConfigureServices((hostContext, services) =>
{
    services.AddHostedService<TestHostService>(); //后用后台服务
})
.Build();

DMS.Redis 基于StackExchange.Redis框架开发,依赖DMS中基础框架,主要用于分布式缓存系统

首先定义你的数据实体文件Redis.json

public class RedisEntityConfig
{
	#region 属性

	/// <summary>
	/// Redis服务器
	/// </summary>
	public string RedisConnectionString { get; set; }

	/// <summary>
	/// Redis密码
	/// </summary>
	public string RedisConnectionPwd { get; set; }

	/// <summary>
	/// 系统自定义Key前缀
	/// </summary>
	public string RedisPrefixKey { get; set; }

	#endregion
}

string类型调用方法

var flag = redisManager.StringSet("dylan", "公众号为:sharecore");
var value = redisManager.StringGet("dylan");
Console.WriteLine($"获取缓存值为:{value}");

List类型调用方法

入队

redisManager.ListRightPush("dylan", "sharecore我是入队的");//入队
long len = redisManager.ListLength("dylan");//队列长度
string b = redisManager.ListRightPop<string>("dylan");//出队

出队

redisManager.ListLeftPush("dylan", "sharecore我是入栈的");//入栈
long len = redisManager.ListLength("dylan");//队列长度
string b = redisManager.ListLeftPop<string>("key123");//出栈

Hash类型调用方法

var data = new
{
    name = "dylan",
    code = "sharecore",
};
bool flag = redisManager.HashExists("dylan", "key1");
if (!flag)
{
    redisManager.HashSet<object>("dylan", "key1", data);
    redisManager.HashSet<object>("dylan", "key2", data);
}
var value = redisManager.HashValues<QueueValue>("dylan");

Sorted类型调用方法

var data = new
{
    name = "dylan",
    code = "sharecore",
};
redisManager.SortedSetAdd("dylan", data, 1.0);//添加
redisManager.SortedSetRemove("dylan",data);//删除
redisManager.SortedSetRangeByRank<QueueValue>("dylan");//获取全部
redisManager.SortedSetLength("dylan");//获取数量

Subscribe 与 Publish类型调用方法

订阅

redisManager.Subscribe("dylan", (channel, value) =>
{
    Console.WriteLine(channel.ToString() + ":" + value.ToString());
});

发布

var data = new
{
    name= "dylan",
    code = "sharecore"
};
redisManager.Publish("dylan", data);

DMS.Log4net,DMS.NLogs日志使用

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
    .UseUrls("http://*:9870")
    .UseNLog($"Configs/nlog.config")
    .UseLog4net($"Configs/log4net.config")
    .UseStartup<Startup>();

DMS.Exceptionless 分布式日志

基于Exceptionless框架开发,依赖DMS中基础框架,主要用于分页式日志系统 github源码地址:https://github.com/exceptionless/Exceptionless.Net 参考资料将客户端服务配置起来,目前仅支持ElasticSearch5.X版本

1.在appsettings.json文件中添加配置

"Exceptionless": {
	"ServerUrl": "http://192.168.0.192:9002",
	"ApiKey": "T1uijEtbtbNcPs0aI1izX6cyscuZbowQKYmEbyUH"
}

2.消息日志使用示例

string tagName = "消息标签";//自定义标签
var data = new ExcDataParam() { Name = "请求参数", Data = new { Id = 001, Name = "张三" } };//自定义单个model
var user = new ExcUserParam() { Id = "No0001", Name = "李廷礼", Email = "litingxian@live.cn", Description = "菁鲤汇高级开发工程师" };//用户信息
var datas = new List<ExcDataParam>()//自定义列表数据
{
	new ExcDataParam(){
		Name="请求参数",
		Data=new { Id = 002, Name = "李四" }
	},
	new ExcDataParam(){
		Name="返回结果",
		Data=new { Id = 003, Name = "王五" }
	}
};

//日志等级:跟踪信息
LessLog.Trace("不带参数");
LessLog.Trace("带标签", tagName);
LessLog.Trace("带用户&标签", user, tagName);
LessLog.Trace("带自定义数据&标签", data, tagName);
LessLog.Trace("带自定义数据&标签", datas, tagName);
LessLog.Trace("带用户&自定义数据&标签", user, data, tagName);
LessLog.Trace("带用户&自定义数据&标签", user, datas, tagName);

//日志等级:调试信息
LessLog.Debug("不带参数");
LessLog.Debug("带标签", tagName);
LessLog.Debug("带用户&标签", user, tagName);
LessLog.Debug("带自定义数据&标签", data, tagName);
LessLog.Debug("带自定义数据&标签", datas, tagName);
LessLog.Debug("带用户&自定义数据&标签", user, data, tagName);
LessLog.Debug("带用户&自定义数据&标签", user, datas, tagName);

//日志等级:普通信息
LessLog.Info("不带参数");
LessLog.Info("带标签", tagName);
LessLog.Info("带用户&标签", user, tagName);
LessLog.Info("带自定义数据&标签", data, tagName);
LessLog.Info("带自定义数据&标签", datas, tagName);
LessLog.Info("带用户&自定义数据&标签", user, data, tagName);
LessLog.Info("带用户&自定义数据&标签", user, datas, tagName);

//日志等级:警告
LessLog.Warn("不带参数");
LessLog.Warn("带标签", tagName);
LessLog.Warn("带用户&标签", user, tagName);
LessLog.Warn("带自定义数据&标签", data, tagName);
LessLog.Warn("带自定义数据&标签", datas, tagName);
LessLog.Warn("带用户&自定义数据&标签", user, data, tagName);
LessLog.Warn("带用户&自定义数据&标签", user, datas, tagName);

//日志等级:致命的
LessLog.Fatal("不带参数");
LessLog.Fatal("带标签", tagName);
LessLog.Fatal("带用户&标签", user, tagName);
LessLog.Fatal("带自定义数据&标签", data, tagName);
LessLog.Fatal("带自定义数据&标签", datas, tagName);
LessLog.Fatal("带用户&自定义数据&标签", user, data, tagName);
LessLog.Fatal("带用户&自定义数据&标签", user, datas, tagName);

//日志等级:异常
LessLog.Error("不带参数");
LessLog.Error("带标签", tagName);
LessLog.Error("带用户&标签", user, tagName);
LessLog.Error("带自定义数据&标签", data, tagName);
LessLog.Error("带自定义数据&标签", datas, tagName);
LessLog.Error("带用户&自定义数据&标签", user, data, tagName);
LessLog.Error("带用户&自定义数据&标签", user, datas, tagName);

3.异常日志使用示例

string tagName = "异常标签";//自定义标签
var data = new ExcDataParam() { Name = "请求参数", Data = new { Id = 001, Name = "张三" } };//自定义单个model
var user = new ExcUserParam() { Id = "No0001", Name = "李廷礼", Email = "litingxian@live.cn", Description = "菁鲤汇高级开发工程师" };//用户信息
var datas = new List<ExcDataParam>()//自定义列表数据
{
	new ExcDataParam(){
		Name="请求参数",
		Data=new { Id = 002, Name = "李四" }
	},
	new ExcDataParam(){
		Name="返回结果",
		Data=new { Id = 003, Name = "王五" }
	}
};
try
{
	LessExceptionLog.Submit("不带参数");
	LessExceptionLog.Submit("带标签", tagName);
	LessExceptionLog.Submit("带用户&标签", user, tagName);
	LessExceptionLog.Submit("带自定义数据&标签", data, tagName);
	LessExceptionLog.Submit("带自定义数据&标签", datas, tagName);
	LessExceptionLog.Submit("带用户&自定义数据&标签", user, data, tagName);
	LessExceptionLog.Submit("带用户&自定义数据&标签", user, datas, tagName);

	//程序逻辑异常测试,用过try catch 捕获
	int number = 0;
	int nubemr1 = 1 / number;
}
catch (Exception ex)
{
	//注意:同一个异常ExceptionsLess只会提交一次,這就说明第二次提交则会无效
	//ex.Submit();//不带任何参数
	//ex.Submit(tagName);//带标签
	//ex.Submit(user, tagName);//带用户&标签
	//ex.Submit(data, tagName);//带自定义数据&标签
	//ex.Submit(datas, tagName);//带自定义数据&标签
	//ex.Submit(user, data, tagName);//带用户&自定义数据&标签
	ex.Submit(user, datas, tagName);//带用户&自定义数据&标签
}

4.功能特性日志使用示例

string tagName = "特性使用标签";//自定义标签
var data = new ExcDataParam() { Name = "请求参数", Data = new { Id = 001, Name = "张三" } };//自定义单个model
var user = new ExcUserParam() { Id = "No0001", Name = "李廷礼", Email = "litingxian@live.cn", Description = "菁鲤汇高级开发工程师" };//用户信息
var datas = new List<ExcDataParam>()//自定义列表数据
{
	new ExcDataParam(){
		Name="请求参数",
		Data=new { Id = 002, Name = "李四" }
	},
	new ExcDataParam(){
		Name="返回结果",
		Data=new { Id = 003, Name = "王五" }
	}
};

LessFeatureLog.Submit("不带参数");
LessFeatureLog.Submit("带标签", tagName);
LessFeatureLog.Submit("带用户&标签", user, tagName);
LessFeatureLog.Submit("带自定义数据&标签", data, tagName);
LessFeatureLog.Submit("带自定义数据&标签", datas, tagName);
LessFeatureLog.Submit("带用户&自定义数据&标签", user, data, tagName);
LessFeatureLog.Submit("带用户&自定义数据&标签", user, datas, tagName);

5.失效链接日志使用示例

string tagName = "失效链接标签";//自定义标签
var data = new ExcDataParam() { Name = "请求参数", Data = new { Id = 001, Name = "张三" } };//自定义单个model
var user = new ExcUserParam() { Id = "No0001", Name = "李廷礼", Email = "litingxian@live.cn", Description = "菁鲤汇高级开发工程师" };//用户信息
var datas = new List<ExcDataParam>()//自定义列表数据
{
	new ExcDataParam(){
		Name="请求参数",
		Data=new { Id = 002, Name = "李四" }
	},
	new ExcDataParam(){
		Name="返回结果",
		Data=new { Id = 003, Name = "王五" }
	}
};
LessLinksLog.Submit("不带参数:http://www.baidu.com");
LessLinksLog.Submit("带标签:http://www.baidu.com", tagName);
LessLinksLog.Submit("带用户&标签:http://www.baidu.com", user, tagName);
LessLinksLog.Submit("带自定义数据&标签:http://www.baidu.com", data, tagName);
LessLinksLog.Submit("带自定义数据&标签:http://www.baidu.com", datas, tagName);
LessLinksLog.Submit("带用户&自定义数据&标签:http://www.baidu.com", user, data, tagName);
LessLinksLog.Submit("带用户&自定义数据&标签:http://www.baidu.com", user, datas, tagName);

About

DMS是一个集中式的中间件框架,每一个小型中间件将会是完全独立的,都将以注册方式使用,主要为了快速开发项目而准备,如:DMS.Autofac,DMS.Consul,DMS.RabbitMQg,DMS.Swagger,GRPC,Thrift,Netty,DMS.Exceptionless,DMS.Log4net,DMS.NLogs,DMS.Consul,Ocelot,IdentityServer,Zookeeper等,Demo中会有每一个中间件的实例方便开发者了解

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages