在DDD中使用MongoDB作为持久化

栏目: 数据库 · 发布时间: 5年前

内容简介: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作为持久化》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

群智能算法及其应用

群智能算法及其应用

高尚 / 中国水利水电出版社 / 2006-5 / 25.00元

《群智能算法及其应用》系统地描述了蚁群算法和粒子群优化算法的理论和实现技术及其应用,简单地介绍了鱼群算法。《群智能算法及其应用》着重强调各种算法的混合,讨论了蚁群算法与模拟退火算法的混合、蚁群算法与遗传算法的混合、蚁群算法与混沌理论混合、模拟退火算法、遗传算法与粒子群优化算法混合、混沌理论与粒子群优化算法的混合以及蚁群算法与粒子群优化算法的混合。书中还讨论了群智能算法在旅行商问题、武器一目标分配问......一起来看看 《群智能算法及其应用》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

URL 编码/解码
URL 编码/解码

URL 编码/解码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具