pull/5174/head
liangshiwei 5 years ago
parent 27e0821fac
commit b2fe5c344f

@ -15,7 +15,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="MongoDB.Driver" Version="2.11.0" />
<PackageReference Include="MongoDB.Driver" Version="2.11.1" />
</ItemGroup>
<ItemGroup>

@ -29,6 +29,12 @@ namespace Volo.Abp.MongoDB
return Database.GetCollection<T>(GetCollectionName<T>());
}
public virtual void InitializeCollections(IMongoDatabase database)
{
Database = database;
ModelSource.GetModel(this);
}
protected virtual string GetCollectionName<T>()
{
return GetEntityModel<T>().CollectionName;

@ -1,7 +1,12 @@
using Microsoft.Extensions.DependencyInjection.Extensions;
using System;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using MongoDB.Driver;
using Volo.Abp.Data;
using Volo.Abp.Domain;
using Volo.Abp.Domain.Repositories.MongoDB;
using Volo.Abp.Modularity;
using Volo.Abp.MongoDB.DependencyInjection;
using Volo.Abp.Uow.MongoDB;
namespace Volo.Abp.MongoDB
@ -9,22 +14,53 @@ namespace Volo.Abp.MongoDB
[DependsOn(typeof(AbpDddDomainModule))]
public class AbpMongoDbModule : AbpModule
{
public override void PreConfigureServices(ServiceConfigurationContext context)
{
context.Services.AddConventionalRegistrar(new AbpMongoDbConventionalRegistrar());
}
public override void ConfigureServices(ServiceConfigurationContext context)
{
context.Services.TryAddTransient(
typeof(IMongoDbContextProvider<>),
typeof(UnitOfWorkMongoDbContextProvider<>)
);
context.Services.TryAddTransient(
typeof(IMongoDbRepositoryFilterer<>),
typeof(MongoDbRepositoryFilterer<>)
);
context.Services.TryAddTransient(
typeof(IMongoDbRepositoryFilterer<,>),
typeof(MongoDbRepositoryFilterer<,>)
);
}
public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
InitializeAllCollections(context.ServiceProvider);
}
private void InitializeAllCollections(IServiceProvider serviceProvider)
{
var dbContexts = serviceProvider.GetServices<IAbpMongoDbContext>();
var connectionStringResolver = serviceProvider.GetService<IConnectionStringResolver>();
foreach (var dbContext in dbContexts)
{
var connectionString = connectionStringResolver.Resolve(ConnectionStringNameAttribute.GetConnStringName(dbContext.GetType()));
var mongoUrl = new MongoUrl(connectionString);
var databaseName = mongoUrl.DatabaseName;
var client = new MongoClient(mongoUrl);
if (databaseName.IsNullOrWhiteSpace())
{
databaseName = ConnectionStringNameAttribute.GetConnStringName(dbContext.GetType());
}
(dbContext as AbpMongoDbContext)?.InitializeCollections(client.GetDatabase(databaseName));
}
}
}
}

@ -0,0 +1,27 @@
using System;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.MongoDB.DependencyInjection
{
public class AbpMongoDbConventionalRegistrar : DefaultConventionalRegistrar
{
public override void AddType(IServiceCollection services, Type type)
{
if (!typeof(IAbpMongoDbContext).IsAssignableFrom(type) || type == typeof(AbpMongoDbContext))
{
return;
}
var dependencyAttribute = GetDependencyAttributeOrNull(type);
var lifeTime = GetLifeTimeOrNull(type, dependencyAttribute);
if (lifeTime == null)
{
return;
}
services.Add(ServiceDescriptor.Describe(typeof(IAbpMongoDbContext), type, ServiceLifetime.Transient));
}
}
}

@ -43,7 +43,7 @@ namespace Volo.Abp.Uow.MongoDB
//TODO: Create only single MongoDbClient per connection string in an application (extract MongoClientCache for example).
var databaseApi = unitOfWork.GetOrAddDatabaseApi(
dbContextKey,
() => new MongoDbDatabaseApi<TMongoDbContext>(CreateDbContext(unitOfWork,mongoUrl,databaseName)));
() => new MongoDbDatabaseApi<TMongoDbContext>(CreateDbContext(unitOfWork, mongoUrl, databaseName)));
return ((MongoDbDatabaseApi<TMongoDbContext>) databaseApi).DbContext;
}
@ -52,9 +52,29 @@ namespace Volo.Abp.Uow.MongoDB
{
var client = new MongoClient(mongoUrl);
var database = client.GetDatabase(databaseName);
var dbContext = unitOfWork.ServiceProvider.GetRequiredService<TMongoDbContext>();
if (unitOfWork.Options.IsTransactional)
{
return CreateDbContextWithTransaction(unitOfWork, mongoUrl, client, database);
}
var dbContext = unitOfWork.ServiceProvider.GetRequiredService<TMongoDbContext>();
dbContext.ToAbpMongoDbContext().InitializeDatabase(database, null);
return dbContext;
}
public TMongoDbContext CreateDbContextWithTransaction(
IUnitOfWork unitOfWork,
MongoUrl url,
MongoClient client,
IMongoDatabase database)
{
var transactionApiKey = $"MongoDb_{url}";
var activeTransaction = unitOfWork.FindTransactionApi(transactionApiKey) as MongoDbTransactionApi;
var dbContext = unitOfWork.ServiceProvider.GetRequiredService<TMongoDbContext>();
if (activeTransaction?.SessionHandle == null)
{
var session = client.StartSession();
@ -65,7 +85,6 @@ namespace Volo.Abp.Uow.MongoDB
session.StartTransaction();
var transactionApiKey = $"MongoDb_{mongoUrl}";
unitOfWork.AddTransactionApi(
transactionApiKey,
new MongoDbTransactionApi(session)
@ -75,7 +94,7 @@ namespace Volo.Abp.Uow.MongoDB
}
else
{
dbContext.ToAbpMongoDbContext().InitializeDatabase(database, null);
dbContext.ToAbpMongoDbContext().InitializeDatabase(database, activeTransaction.SessionHandle);
}
return dbContext;

@ -5,7 +5,7 @@ using Xunit;
namespace Volo.Abp.Identity.MongoDB
{
[Collection(MongoTestCollection.Name)]
[Collection(MongoTestCollection.Name)]
public class OrganizationUnitRepository_Tests : OrganizationUnitRepository_Tests<AbpIdentityMongoDbTestModule>
{
}

Loading…
Cancel
Save