回到目錄
倉儲大叔,隻要是持久化的東西,都要把它和倉儲撤上關系,為啥,為的是開發人員在使用時統一,高可用及友善在各種方式之間實作動态的切換,如ef與redis和mongoDB的切換,你完成可以通過IRepository接口再配合IOC來實作,友善緻極!
之間寫過一個redis倉儲和xml倉儲,感興趣的同學可以先去看看,呵呵。
MongoDB在實作倉儲時,先要知道一些概念,即它的一些connectionstring,即連接配接串
<connectionStrings>
<add name="NormTests" connectionString="mongodb://Username:Password@server:port/dbName/query"/>
</connectionStrings>
對于大叔的MongoDBRepository,把它進行了拆分,使用Appsetting進行分别的設定
<appSettings file="config.user">
<add key="MongoDB_Host" value="localhost:27017"/>
<add key="MongoDB_DbName" value=""/>
<add key="MongoDB_UserName" value=""/>
<add key="MongoDB_Password" value=""/>
</appSettings>
如果要配置讀寫分離,那麼第一個host為主庫,後面的為從庫,如下面的字元串,将寫操作定在主庫,讀操作定在各個從庫
mongodb://server1,server2,server3/?slaveOk=true
下面看一下源代碼
namespace MongoDb.Data.Core
{
/// <summary>
/// 通過MongoDb實作資料的持久化
/// </summary>
/// <typeparam name="TEntity"></typeparam>
public class MongoDBRepository<TEntity> :
IExtensionRepository<TEntity> where TEntity : class
{
#region ConnectionString
private static readonly string _connectionStringHost = ConfigurationManager.AppSettings["host"];
private static readonly string _dbName = ConfigurationManager.AppSettings["dbName"];
private static readonly string _userName = ConfigurationManager.AppSettings["userName"];
private static readonly string _password = ConfigurationManager.AppSettings["password"];
public static string ConnectionString(string options)
{
var database = _dbName;
var userName = _userName;
var password = _password;
var authentication = string.Empty;
var host = string.Empty;
if (userName != null)
{
authentication = string.Concat(userName, ':', password, '@');
}
if (!string.IsNullOrEmpty(options) && !options.StartsWith("?"))
{
options = string.Concat('?', options);
}
host = string.IsNullOrEmpty(_connectionStringHost) ? "localhost" : _connectionStringHost;
database = database ?? "Test";
//mongodb://[username:password@]host1[:port1][,host2[:port2],…[,hostN[:portN]]][/[database][?options]]
return string.Format("mongodb://{0}{1}/{2}{3}?{4}", authentication, host, database, options);
}
public static string ConnectionString()
{
return ConnectionString(null);
}
#endregion
#region Public Properties
public IMongoCollection<TEntity> Table
{
get
{
using (var mongo = Mongo.Create(ConnectionString()))
{
return mongo.Database.GetCollection<TEntity>(typeof(TEntity).Name);
}
}
}
#endregion
#region IRepository<TEntity> 成員
public void SetDbContext(IUnitOfWork unitOfWork)
{
throw new NotImplementedException();
}
public void Insert(TEntity item)
{
using (var mongo = Mongo.Create(ConnectionString()))
{
var table = mongo.Database.GetCollection<TEntity>(typeof(TEntity).Name);
table.Insert(item);
}
}
public void Delete(TEntity item)
{
using (var mongo = Mongo.Create(ConnectionString()))
{
var table = mongo.Database.GetCollection<TEntity>(typeof(TEntity).Name);
table.Delete(item);
}
}
public void Update(TEntity item)
{
using (var mongo = Mongo.Create(ConnectionString()))
{
var table = mongo.Database.GetCollection<TEntity>(typeof(TEntity).Name);
table.Save(item);
}
}
public IQueryable<TEntity> GetModel()
{
using (var mongo = Mongo.Create(ConnectionString()))
{
return mongo.Database.GetCollection<TEntity>(typeof(TEntity).Name).AsQueryable();
}
}
public TEntity Find(params object[] id)
{
using (var mongo = Mongo.Create(ConnectionString()))
{
return mongo.Database
.GetCollection<TEntity>(typeof(TEntity).Name)
.Find(new { ID = new ObjectId(id[0].ToString()) })
.FirstOrDefault();
}
}
#endregion
#region IExtensionRepository<TEntity> 成員
public void Insert(IEnumerable<TEntity> item)
{
using (var mongo = Mongo.Create(ConnectionString()))
{
var table = mongo.Database.GetCollection<TEntity>(typeof(TEntity).Name);
item.ToList().ForEach(i =>
{
table.Insert(i);
});
}
}
public void Update(IEnumerable<TEntity> item)
{
using (var mongo = Mongo.Create(ConnectionString()))
{
var table = mongo.Database.GetCollection<TEntity>(typeof(TEntity).Name);
item.ToList().ForEach(i =>
{
table.Save(i);
});
}
}
public void Delete(IEnumerable<TEntity> item)
{
using (var mongo = Mongo.Create(ConnectionString()))
{
var table = mongo.Database.GetCollection<TEntity>(typeof(TEntity).Name);
item.ToList().ForEach(i =>
{
table.Delete(i);
});
}
}
public void Update<T>(System.Linq.Expressions.Expression<Action<T>> entity) where T : class
{
throw new NotImplementedException();
}
public IQueryable<TEntity> GetModel(System.Linq.Expressions.Expression<Func<TEntity, bool>> predicate)
{
using (var mongo = Mongo.Create(ConnectionString()))
{
return mongo.Database.GetCollection<TEntity>(typeof(TEntity).Name).AsQueryable().Where(predicate);
}
}
public TEntity Find(System.Linq.Expressions.Expression<Func<TEntity, bool>> predicate)
{
using (var mongo = Mongo.Create(ConnectionString()))
{
return mongo.Database.GetCollection<TEntity>(typeof(TEntity).Name).AsQueryable().FirstOrDefault(predicate);
}
}
public void BulkInsert(IEnumerable<TEntity> item, bool isRemoveIdentity)
{
throw new NotImplementedException();
}
public void BulkInsert(IEnumerable<TEntity> item)
{
throw new NotImplementedException();
}
public void BulkUpdate(IEnumerable<TEntity> item, params string[] fieldParams)
{
throw new NotImplementedException();
}
public void BulkDelete(IEnumerable<TEntity> item)
{
throw new NotImplementedException();
}
public event Action<SavedEventArgs> AfterSaved;
public event Action<SavedEventArgs> BeforeSaved;
public IQueryable<TEntity> GetModel(Frameworks.Entity.Core.Specification.ISpecification<TEntity> specification)
{
throw new NotImplementedException();
}
public TEntity Find(Frameworks.Entity.Core.Specification.ISpecification<TEntity> specification)
{
return GetModel(specification).FirstOrDefault();
}
public IQueryable<TEntity> GetModel(Action<IOrderable<TEntity>> orderBy, Frameworks.Entity.Core.Specification.ISpecification<TEntity> specification)
{
var linq = new Orderable<TEntity>(GetModel(specification));
orderBy(linq);
return linq.Queryable;
}
#endregion
#region IRepositoryAsync<TEntity> 成員
public Task InsertAsync(TEntity item)
{
throw new NotImplementedException();
}
public Task DeleteAsync(TEntity item)
{
throw new NotImplementedException();
}
public Task UpdateAsync(TEntity item)
{
throw new NotImplementedException();
}
public Task InsertAsync(IEnumerable<TEntity> item)
{
throw new NotImplementedException();
}
public Task UpdateAsync(IEnumerable<TEntity> item)
{
throw new NotImplementedException();
}
public Task DeleteAsync(IEnumerable<TEntity> item)
{
throw new NotImplementedException();
}
public Task BulkInsertAsync(IEnumerable<TEntity> item, bool isRemoveIdentity)
{
throw new NotImplementedException();
}
public Task BulkInsertAsync(IEnumerable<TEntity> item)
{
throw new NotImplementedException();
}
public Task BulkUpdateAsync(IEnumerable<TEntity> item, params string[] fieldParams)
{
throw new NotImplementedException();
}
public Task BulkDeleteAsync(IEnumerable<TEntity> item)
{
throw new NotImplementedException();
}
#endregion
#region IOrderableRepository<TEntity> 成員
public IQueryable<TEntity> GetModel(Action<IOrderable<TEntity>> orderBy)
{
var linq = new Orderable<TEntity>(GetModel());
orderBy(linq);
return linq.Queryable;
}
public IQueryable<TEntity> GetModel(Action<IOrderable<TEntity>> orderBy, System.Linq.Expressions.Expression<Func<TEntity, bool>> predicate)
{
var linq = new Orderable<TEntity>(GetModel(predicate));
orderBy(linq);
return linq.Queryable;
}
#endregion
}
}
回到目錄
作者:倉儲大叔,張占嶺,
榮譽:微軟MVP
QQ:853066980
支付寶掃一掃,為大叔打賞!
