Commit 86f50128 authored by 阿星Plus's avatar 阿星Plus

MongoDb

parent 4fbb11cb
......@@ -25,7 +25,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Plus.Extensions", "src\Plus
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Plus.Log4Net", "src\Plus.Log4Net\Plus.Log4Net.csproj", "{F4631747-89D2-4EA8-8684-9217D463D4C6}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Plus.MongoDB", "src\Plus.MongoDB\Plus.MongoDB.csproj", "{289760B5-2E69-4D9F-8F1F-2D80EA1FC36D}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Plus.MongoDb", "src\Plus.MongoDB\Plus.MongoDb.csproj", "{289760B5-2E69-4D9F-8F1F-2D80EA1FC36D}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Plus.RedisCache", "src\Plus.RedisCache\Plus.RedisCache.csproj", "{BBCB7D18-8BA5-461A-B3B2-3E9A79EDA6FB}"
EndProject
......
namespace Plus.MongoDb.Configuration
{
/// <summary>
/// IMongoDbModuleConfiguration
/// </summary>
public interface IMongoDbModuleConfiguration
{
string ConnectionString { get; set; }
string DatabaseName { get; set; }
}
}
\ No newline at end of file
namespace Plus.MongoDb.Configuration
{
/// <summary>
/// MongoDbModuleConfiguration
/// </summary>
internal class MongoDbModuleConfiguration : IMongoDbModuleConfiguration
{
public string ConnectionString { get; set; }
public string DatabaseName { get; set; }
}
}
\ No newline at end of file
using MongoDB.Driver;
namespace Plus.MongoDb
{
/// <summary>
/// Defines interface to obtain a <see cref="MongoDatabase"/> object.
/// </summary>
public interface IMongoDatabaseProvider
{
/// <summary>
/// Gets the <see cref="MongoDatabase"/>.
/// </summary>
MongoDatabase Database { get; }
}
}
\ No newline at end of file
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="mongocsharpdriver" Version="2.8.1" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Plus\Plus.csproj" />
</ItemGroup>
</Project>
using Plus.Modules;
using Plus.MongoDb.Configuration;
using System.Reflection;
namespace Plus.MongoDb
{
/// <summary>
/// MongoDB 数据访问层
/// </summary>
[DependsOn(typeof(PlusLeadershipModule))]
public class PlusMongoDbModule : PlusModule
{
public override void PreInitialize()
{
IocManager.Register<IMongoDbModuleConfiguration, MongoDbModuleConfiguration>();
}
public override void Initialize()
{
IocManager.RegisterAssembly(Assembly.GetExecutingAssembly());
}
}
}
\ No newline at end of file
using MongoDB.Driver;
using MongoDB.Driver.Linq;
using Plus.Domain.Entities;
using Plus.Domain.Repositories;
using System.Linq;
namespace Plus.MongoDb.Repositories
{
/// <summary>
/// MongoDB Repository
/// </summary>
/// <typeparam name="TEntity"></typeparam>
public class MongoDbRepositoryBase<TEntity> : MongoDbRepositoryBase<TEntity, int>, IRepository<TEntity>
where TEntity : class, IEntity<int>
{
public MongoDbRepositoryBase(IMongoDatabaseProvider databaseProvider)
: base(databaseProvider)
{
}
}
/// <summary>
/// MongoDB Repository
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <typeparam name="TPrimaryKey"></typeparam>
public class MongoDbRepositoryBase<TEntity, TPrimaryKey> : PlusRepositoryBase<TEntity, TPrimaryKey>
where TEntity : class, IEntity<TPrimaryKey>
{
public virtual MongoDatabase Database
{
get { return _databaseProvider.Database; }
}
public virtual MongoCollection<TEntity> Collection
{
get
{
return _databaseProvider.Database.GetCollection<TEntity>(typeof(TEntity).Name);
}
}
private readonly IMongoDatabaseProvider _databaseProvider;
public MongoDbRepositoryBase(IMongoDatabaseProvider databaseProvider)
{
_databaseProvider = databaseProvider;
}
public override IQueryable<TEntity> GetAll()
{
return Collection.AsQueryable();
}
public override TEntity Get(TPrimaryKey id)
{
var query = MongoDB.Driver.Builders.Query<TEntity>.EQ(e => e.Id, id);
var entity = Collection.FindOne(query);
if (entity.IsNull())
{
throw new EntityNotFoundException("There is no such an entity with given primary key. Entity type: " + typeof(TEntity).FullName + ", primary key: " + id);
}
return entity;
}
public override TEntity FirstOrDefault(TPrimaryKey id)
{
var query = MongoDB.Driver.Builders.Query<TEntity>.EQ(e => e.Id, id);
return Collection.FindOne(query);
}
public override TEntity Insert(TEntity entity)
{
Collection.Insert(entity);
return entity;
}
public override TEntity Update(TEntity entity)
{
Collection.Save(entity);
return entity;
}
public override void Delete(TEntity entity)
{
Delete(entity.Id);
}
public override void Delete(TPrimaryKey id)
{
var query = MongoDB.Driver.Builders.Query<TEntity>.EQ(e => e.Id, id);
Collection.Remove(query);
}
}
}
\ No newline at end of file
using MongoDB.Driver;
using Plus.Dependency;
using Plus.Domain.Uow;
using Plus.MongoDb.Configuration;
using System.Threading.Tasks;
namespace Plus.MongoDb.Uow
{
/// <summary>
/// 工作单元
/// TODO...
/// </summary>
public class MongoDbUnitOfWork : UnitOfWorkBase, ITransientDependency
{
public MongoDatabase Database { get; private set; }
private readonly IMongoDbModuleConfiguration _configuration;
public MongoDbUnitOfWork(
IMongoDbModuleConfiguration configuration,
IConnectionStringResolver connectionStringResolver,
IUnitOfWorkFilterExecuter filterExecuter,
IUnitOfWorkDefaultOptions defaultOptions)
: base(
connectionStringResolver,
defaultOptions,
filterExecuter)
{
_configuration = configuration;
}
public override void SaveChanges()
{
throw new System.NotImplementedException();
}
public override Task SaveChangesAsync()
{
throw new System.NotImplementedException();
}
protected override void CompleteUow()
{
throw new System.NotImplementedException();
}
protected override Task CompleteUowAsync()
{
throw new System.NotImplementedException();
}
protected override void DisposeUow()
{
throw new System.NotImplementedException();
}
}
}
\ No newline at end of file
using MongoDB.Driver;
using Plus.Dependency;
using Plus.Domain.Uow;
namespace Plus.MongoDb.Uow
{
/// <summary>
/// Implements <see cref="IMongoDatabaseProvider"/> that gets database from active unit of work.
/// </summary>
public class UnitOfWorkMongoDatabaseProvider : IMongoDatabaseProvider, ITransientDependency
{
public MongoDatabase Database
{
get
{
return ((MongoDbUnitOfWork)_currentUnitOfWork.Current).Database;
}
}
private readonly ICurrentUnitOfWorkProvider _currentUnitOfWork;
public UnitOfWorkMongoDatabaseProvider(ICurrentUnitOfWorkProvider currentUnitOfWork)
{
_currentUnitOfWork = currentUnitOfWork;
}
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment