内容简介:1.domain层创建entity的定义
1.domain层创建entity的定义
public class CommonLog
{
[BsonElement( "_id" )]
public ObjectId Id { set ; get ; }
public DateTime OperationDateTime { get ; private set ; }
}
需要注意的是 mongodb 的主键是ObjectId,string是转换失败的。本来是不想在domain层引用mongodb.bson,但是用代码map一直出错了。
2.建立mongodb的持久化层
a. 创建mongodb的配置类,用于从配置文件读取数据库连接字符串
public class SCWebApiMongoDBSettings
{
public string ConnectionString { get ; set ; }
public string Database { get ; set ; }
}
b. 在webapi的host工程中Startup.cs的 ConfigureServices方法中, 读取配置文件,并把值传给这个类
//读取MongoDB的配置
services.Configure<SCWebApiMongoDBSettings>(options =>
{
options.ConnectionString = _appConfiguration.GetSection( "MongoDB:ConnectionString" ).Value;
options.Database = _appConfiguration.GetSection( "MongoDB:Database" ).Value;
});
c. appsetttings.json中配置如下:
"MongoDB" : {
"ConnectionString" : "mongodb://test:123456@127.0.0.1:27017?authSource=admin" ,
"Database" : "test"
}
d. 创建dbcontext类, 并使用setting类。
public class SCWebApiMongoDBContext < T >
{
private readonly IMongoDatabase _database = null ;
public SCWebApiMongoDBContext(IOptions<SCWebApiMongoDBSettings> options)
{
var client = new MongoClient(options.Value.ConnectionString);
if (client != null )
{
_database = client.GetDatabase(options.Value.Database);
}
}
public IMongoCollection<T> GetCollection( string collection)
{
return _database.GetCollection<T>(collection);
}
}
asp.net core 通过IOptions依赖注入了在web中读取的配置, 从而在构造的时候能获取到mongodb的配置。
e. 创建Repository接口
public interface IMongoDBRepository < T >
{
}
f. 实现Repository类
public abstract class SCWebApiRepositoryBase < T > : IMongoDBRepository<T>
{
protected readonly SCWebApiMongoDBContext<T> _context;
public SCWebApiRepositoryBase(IOptions<SCWebApiMongoDBSettings> options)
{
_context = new SCWebApiMongoDBContext<T>(options);
}
public virtual async Task< long > GetCount( string systemId)
{
if ( string .IsNullOrEmpty(systemId))
{
return 0;
}
var collection = _context.GetCollection( string .Format( "{0}_SL" , systemId));
var result = await collection.CountDocumentsAsync(Builders<T>.Filter.Empty);
return result;
}
public override async Task<IList<CommonLog>> GetAllRecords( string systemId, DateTime startDate, DateTime endDate)
{
if ( string .IsNullOrEmpty(systemId))
{
return null ;
}
var collection = _context.GetCollection( string .Format( "{0}_SL" , systemId));
var sort = Builders<CommonLog>.Sort.Ascending(log => log.OperationDateTime);
var result = await collection.FindAsync(log => log.OperationDateTime >= startDate && log.OperationDateTime <= endDate,
new FindOptions<CommonLog, CommonLog>()
{
Sort = sort
});
return result.ToList();
}
需要注意的是, 查询所有的时候可以用 Builders<T>.Filter.Empty; 另外注意添加过滤条件和 排序 的使用方式。
g.添加mongodb的schema和entity类的map
public class CommonLogMap
{
public void Map()
{
BsonClassMap.RegisterClassMap<CommonLog>(map =>
{
map.AutoMap();
});
}
}
h. 创建类, 继承AbpModule, 使得ABP的di等运行正常, 并且在初始化逻辑中调用mongodb的mao
[DependsOn( typeof (SCWebApiCoreModule))]
public class SCWebApiMongoDBCoreModule : AbpModule
{
public override void PostInitialize()
{
base .PostInitialize();
new CommonLogMap().Map();
}
public override void Initialize()
{
IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());
}
}
i. 接下来就是web host工程的使用了, 打开Startup.cs的 ConfigureServices函数, 添加mogodb repository的实例化和生命周期
//配置MongoDB的repository实例化生命周期
services.AddScoped<ICommonLogRepository, CommonLogRepository>();
AddScope代表一个链接共享一个repository 实例。 还有其他配置, 比如每次请求一个; 单例等等。
j. 接下来就是在application service 层创建App Service, 并在构造函数中di方式使用repository了
public class ShenKangAppService : SCWebApiAppServiceBase
{
private readonly ICommonLogRepository _commonLogRepository;
private readonly IClientInfoProvider _clientInfoProvider;
public ShenKangAppService(ICommonLogRepository commonLogRepository, IClientInfoProvider clientInfoProvider)
{
_commonLogRepository = commonLogRepository;
_clientInfoProvider = clientInfoProvider;
}
}
需要注意的是, 想要在app service层访问web请求的ip等信息时, 不能像web api层那样可以直接在controller类调用HttpContext或者Request。 Abp框架提供了IClientInfoProvider, 可以di使用获取客户端ip地址。
以上所述就是小编给大家介绍的《在DDD中使用MongoDB作为持久化》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。