1.首先第一度先把mongodb数据库连接放到appsetting.json中
{
"ConnectionString": {
"Mongodb": "mongodb://用户名:密码@你要连接的Ip:27017/数据库的名称?authSource=admin",
"DatabaseName": "admin"
},
}
解释一下mongodb数据库连接字符串 ip后边的admin是你连接当前ip下面的数据库名称问号后边的就是确定你连接的是哪个数据库
2. 写一个帮助类去实现一些增删改查的操作
IConfiguration这个是strart up中的一个已经被注册号的类他可以帮你拿到appsetting.json中你定义的字符串具体就是看 GetSection这个方法了具体写法在下面可以参考一下GetConnectionString这个按道理说也可以拿到但是在我这个程序中我没拿到所以就先用GetSection这个就行了然后取他的value值
public class MongoDbConnectionHelper
{
private readonly IMongoDatabase _database;
public MongoDbConnectionHelper(IConfiguration config)
{
var client = new MongoClient(config.GetSection("ConnectionString:Mongodb").Value); //获取链接字符串
_database = client.GetDatabase(config.GetSection("ConnectionString:DatabaseName").Value);
//var database = client.GetDatabase(config.GetSection("MongoDBSetting:DBName").Value); //数据库名 (不存在自动创建)
//获取对特定数据表集合中的数据的访问
// _collection = database.GetCollection<T>(tableName); // (不存在自动创建)
}
/// <summary>
/// 获取所有
/// </summary>
/// <returns></returns>
public List<T> Get<T>() where T : BaseModel
{
var _collection = _database.GetCollection<T>(GetTableName<T>());
return _collection.Find<T>(t => true).ToList();
}
/// <summary>
/// 单个插入
/// </summary>
/// <param name="T"></param>
/// <returns></returns>
public bool Insert<T>(T t) /*where T : BaseModel*/
{
var tableName = GetTableName<T>();
var _collection = _database.GetCollection<T>(tableName);
_collection.InsertOne(t);
return true;
}
/// <summary>
/// 批量插入
/// </summary>
/// <param name="T"></param>
/// <returns></returns>
public bool InsertMany<T>(List<T> t) /*where T : BaseModel*/
{
var tableName = GetTableName<T>();
var _collection = _database.GetCollection<T>(tableName);
_collection.InsertMany(t);
return true;
}
/// <summary>
/// 获取单个
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public T Get<T>(string id) where T : BaseModel
{
var tableName = GetTableName<T>();
var _collection = _database.GetCollection<T>(tableName);
return _collection.Find<T>(t => t._id.ToString().Equals(id)).FirstOrDefault();
}
/// <summary>
/// 更新
/// </summary>
/// <param name="id"></param>
/// <param name="TIn"></param>
public void Update<T>(string id, T TIn) where T : BaseModel
{
var tableName = GetTableName<T>();
var _collection = _database.GetCollection<T>(tableName);
_collection.ReplaceOne(t => t._id.ToString().Equals(id), TIn);
}
/// <summary>
/// 删除
/// </summary>
/// <param name="TIn"></param>
public void Remove<T>(T TIn) where T : BaseModel
{
var tableName = GetTableName<T>();
var _collection = _database.GetCollection<T>(tableName);
_collection.DeleteOne(t => t._id == TIn._id);
}
/// <summary>
/// 根据id删除
/// </summary>
/// <param name="id"></param>
public void Remove<T>(string id) where T : BaseModel
{
var tableName = GetTableName<T>();
var _collection = _database.GetCollection<T>(tableName);
_collection.DeleteOne(t => t._id.ToString().Equals(id));
}
/// <summary>
/// 获取当前操作的表名称
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
protected string GetTableName<T>()
{
Type t = typeof(T);
return t.Name;
}
//protected string GetTableName<T>()
//{
// Type t = typeof(T);
// var value = t.GetCustomAttributes(typeof(TableAttribute), true);
// if (value != null && value.Length > 0)
// {
// var attr = (TableAttribute)value[0];
// return attr.Name;
// }
// return null;
//}
}
3.第三步就是把这个帮助类注册到盒子容器里面去就是所谓的startup中它里面有一个Configure还有一个ConfigureServices 如果要依赖注入使用之前那个帮助类那就要在 ConfigureServices这个里面写
首先这个service下面的方法有多个我这边用的是AddSingleton因为用到了单例模式这个属性的意思就是在这个程序启动的时候他只是执行一次这样就可以避免对一个队列的多次new出实例因为我这个里面 用到了queue队列这个是c#自带的他就要求用户访问我的接口他不会new多个queue实例就程序启动就只有一个队列再用子线程的概念再跑单例模式就是这样,,还有一个是AddScoped这个属性就是在这个程序启动之后被用到了多少次他就启动多少次嗯我了解的就是这样 还有另一个我没用到就不说了下面这些为啥都用AddSingleton那是因为我这些都用到了单例模式他们都是互相有依赖关系的所以就你懂的。
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<MongoDbConnectionHelper>();
services.AddSingleton<Base64Helper>();
services.AddSingleton<LogService>();
services.AddSingleton<QueueManager>();
services.AddControllers();
}
4 建立一个service来去 写你的底层代码就是连接数据库和执行的一些逻辑代码这个你就可以用那个依赖注入注入你要用的那些类了比如说这些
private readonly MongoDbConnectionHelper mongoDbConnectionHelper;
public LogService(MongoDbConnectionHelper _mongoDbConnectionHelper)
{
mongoDbConnectionHelper = _mongoDbConnectionHelper;
}
具体逻辑代码我就不贴了
5.在搞一个控制器然后就 当然了第一步先把你要写的service里面的逻辑代码注入到这个控制器中嗯就是这样 这个就不用了在startup添加到容器里面了
然后控制器里面写一个api就OK了然后访问就没毛病了
6 最重要的队列还没说呢就是首先第一建立一个类去存放他 ConcurrentQueue这个据说是线程比较安全的那种队列
public class QueueManager
{
private ConcurrentQueue<LogDto> queue = new ConcurrentQueue<LogDto>();
private LogService logService;
private bool flag = true;
public QueueManager(LogService _logService)
{
logService = _logService;
}
private QueueManager()
{
}
public void GetSingleton(LogDto logDto)
{
queue.Enqueue(logDto);
}
public void StartTicketTask()
{
if (!flag)
return;
flag = false;
Task.Run(()=>{
while (true)
{
if (!queue.TryDequeue(out LogDto results))
{
Thread.Sleep(500);
continue;
}
Console.WriteLine($"处理队列数据 {JsonConvert.SerializeObject(results)}");
logService.SaveLog(results);
}
});
}
}