在DDD中使用MongoDB作为持久化

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

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

查看所有标签

猜你喜欢:

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

数字化崇拜

数字化崇拜

[加] 文森特·莫斯可 / 黄典林 / 北京大学出版社 / 2010-1 / 26.00元

与此前的许多技术发展一样,以互联网为标志的数字化时代同样为人们提供了社会根本性变革的许诺:通过电脑,我们可以超越时空和政治。在本书中,文森特·莫斯可透过技术发展和经济泡沫的迷雾,试图探明围绕数字化新技术出现了哪些迷思,以及为何人们对这些迷思坚信不疑。他认为互联网时代投资者如此狂热的动因并不是他们对经济规则的无知,而是对赛博空间开启了一个新世界这样的迷思的坚定信念。 莫斯可指出,迷思并不是一些......一起来看看 《数字化崇拜》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

html转js在线工具
html转js在线工具

html转js在线工具

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

HEX HSV 互换工具