using System.Collections.Generic; using MongoDB.Driver; namespace ETModel { [ObjectSystem] public class DbComponentSystem : AwakeSystem { public override void Awake(DBComponent self) { self.Awake(); } } /// /// 用来缓存数据 /// public class DBComponent : Component { public MongoClient mongoClient; public IMongoDatabase database; public const int taskCount = 32; public List tasks = new List(taskCount); public void Awake() { DBConfig config = StartConfigComponent.Instance.StartConfig.GetComponent(); string connectionString = config.ConnectionString; mongoClient = new MongoClient(connectionString); this.database = this.mongoClient.GetDatabase(config.DBName); for (int i = 0; i < taskCount; ++i) { DBTaskQueue taskQueue = ComponentFactory.Create(); this.tasks.Add(taskQueue); } } public IMongoCollection GetCollection(string name) { return this.database.GetCollection(name); } public ETTask Add(ComponentWithId component, string collectionName = "") { ETTaskCompletionSource tcs = new ETTaskCompletionSource(); if (string.IsNullOrEmpty(collectionName)) { collectionName = component.GetType().Name; } DBSaveTask task = ComponentFactory.CreateWithId(component.Id, component, collectionName, tcs); this.tasks[(int)((ulong)task.Id % taskCount)].Add(task); return tcs.Task; } public ETTask AddBatch(List components, string collectionName) { ETTaskCompletionSource tcs = new ETTaskCompletionSource(); DBSaveBatchTask task = ComponentFactory.Create, string, ETTaskCompletionSource>(components, collectionName, tcs); this.tasks[(int)((ulong)task.Id % taskCount)].Add(task); return tcs.Task; } public ETTask Get(string collectionName, long id) { ETTaskCompletionSource tcs = new ETTaskCompletionSource(); DBQueryTask dbQueryTask = ComponentFactory.CreateWithId>(id, collectionName, tcs); this.tasks[(int)((ulong)id % taskCount)].Add(dbQueryTask); return tcs.Task; } public ETTask> GetBatch(string collectionName, List idList) { ETTaskCompletionSource> tcs = new ETTaskCompletionSource>(); DBQueryBatchTask dbQueryBatchTask = ComponentFactory.Create, string, ETTaskCompletionSource>>(idList, collectionName, tcs); this.tasks[(int)((ulong)dbQueryBatchTask.Id % taskCount)].Add(dbQueryBatchTask); return tcs.Task; } public ETTask> GetJson(string collectionName, string json) { ETTaskCompletionSource> tcs = new ETTaskCompletionSource>(); DBQueryJsonTask dbQueryJsonTask = ComponentFactory.Create>>(collectionName, json, tcs); this.tasks[(int)((ulong)dbQueryJsonTask.Id % taskCount)].Add(dbQueryJsonTask); return tcs.Task; } } }