在DDD中使用MongoDB作为持久化

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

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

查看所有标签

猜你喜欢:

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

场景革命

场景革命

吴声 / 机械工业出版社 / 2015-7-1 / 59.00元

How-old如何引爆了朋友圈的全民脑洞狂欢? Uber是打车软件,还是入口? 为什么“自拍”会成为一个产业? 美团如何成为电影票房冠军的幕后推手? 商业进入了新物种时代,超级平台之后,PC时代以降,IoT(万物互联)崛起之时,到底什么是新的入口?一系列的颠覆使我们开始正视移动互联时代的品类创造方法,一场孕育已久的场景革命正在发生。 《场景革命:重构人与商业的连接》为......一起来看看 《场景革命》 这本书的介绍吧!

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

在线 XML 格式化压缩工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具