You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
abp/docs/zh-Hans/MongoDB.md

2.7 KiB

MongoDB 集成

本文会介绍如何将MongoDB集成到基于ABP的应用程序中以及如何配置它

安装

集成MongoDB需要用到Volo.Abp.MongoDB这个包。将它安装到你的项目中(如果是多层架构,安装到数据层和基础设施层):

Install-Package Volo.Abp.MongoDB

然后添加 AbpMongoDbModule 依赖到你的 模块中:

using Volo.Abp.MongoDB;
using Volo.Abp.Modularity;

namespace MyCompany.MyProject
{
    [DependsOn(typeof(AbpMongoDbModule))]
    public class MyModule : AbpModule
    {
        //...
    }
}

创建一个Mongo Db Context

ABP中引入了 Mongo Db Context 的概念跟Entity Framework Core的DbContext很像让使用和配置集合变得更简单。举个例子

public class MyDbContext : AbpMongoDbContext
{
    public IMongoCollection<Question> Questions => Collection<Question>();

    public IMongoCollection<Category> Categories => Collection<Category>();

    protected override void CreateModel(IMongoModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Question>(b =>
        {
            b.CollectionName = "Questions";
        });
    }
}
  • 继承 AbpMongoDbContext
  • 为每一个mongo集合添加一个公共的 IMongoCollection<TEntity> 属性。ABP默认使用这些属性创建默认的仓储
  • 重写 CreateModel 方法,可以在方法中配置集合(如设置集合在数据库中的名字)

将 Db Context 注入到依赖注入中

在你的模块中使用 AddAbpDbContext 方法将Db Context注入到 依赖注入系统中.

using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.MongoDB;
using Volo.Abp.Modularity;

namespace MyCompany.MyProject
{
    [DependsOn(typeof(AbpMongoDbModule))]
    public class MyModule : AbpModule
    {
        public override void ConfigureServices(ServiceConfigurationContext context)
        {
            context.Services.AddMongoDbContext<MyDbContext>();

            //...
        }
    }
}

添加默认的仓储

在注入的时候使用 AddDefaultRepositories(), ABP就能自动为Db Context中的每一个实体创建 仓储

services.AddMongoDbContext<MyDbContext>(options =>
{
    options.AddDefaultRepositories();
});

这样就会默认为每一个聚合根实体继承自AggregateRoot的类创建一个仓储。如果你也想为其他的实体创建仓储includeAllEntities 设置为 true就可以了:

services.AddMongoDbContext<MyDbContext>(options =>
{
    options.AddDefaultRepositories(includeAllEntities: true);
});

现在可以在你的服务中注入并使用IRepository<TEntity>IQueryableRepository<TEntity>了。