mirror of https://github.com/abpframework/abp.git
19 changed files with 271 additions and 74 deletions
@ -0,0 +1,11 @@ |
|||
using System; |
|||
|
|||
namespace Volo.Abp.MongoDB |
|||
{ |
|||
public interface IMongoEntityModel |
|||
{ |
|||
Type EntityType { get; } |
|||
|
|||
string CollectionName { get; } |
|||
} |
|||
} |
|||
@ -0,0 +1,15 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using JetBrains.Annotations; |
|||
|
|||
namespace Volo.Abp.MongoDB |
|||
{ |
|||
public interface IMongoModelBuilder |
|||
{ |
|||
void Entity<TEntity>([NotNull] Action<MongoEntityModelBuilder> buildAction); |
|||
|
|||
void Entity([NotNull] Type entityType, [NotNull] Action<MongoEntityModelBuilder> buildAction); |
|||
|
|||
IReadOnlyList<MongoEntityModelBuilder> GetEntities(); |
|||
} |
|||
} |
|||
@ -0,0 +1,7 @@ |
|||
namespace Volo.Abp.MongoDB |
|||
{ |
|||
public interface IMongoModelSource |
|||
{ |
|||
MongoDbContextModel GetModel(AbpMongoDbContext dbContext); |
|||
} |
|||
} |
|||
@ -0,0 +1,19 @@ |
|||
using System; |
|||
|
|||
namespace Volo.Abp.MongoDB |
|||
{ |
|||
public class MongoCollectionAttribute : Attribute |
|||
{ |
|||
public string CollectionName { get; set; } |
|||
|
|||
public MongoCollectionAttribute() |
|||
{ |
|||
|
|||
} |
|||
|
|||
public MongoCollectionAttribute(string collectionName) |
|||
{ |
|||
CollectionName = collectionName; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,23 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using System.Reflection; |
|||
using MongoDB.Driver; |
|||
using Volo.Abp.Domain.Entities; |
|||
using Volo.Abp.Reflection; |
|||
|
|||
namespace Volo.Abp.MongoDB |
|||
{ |
|||
internal static class MongoDbContextHelper |
|||
{ |
|||
public static IEnumerable<Type> GetEntityTypes(Type dbContextType) |
|||
{ |
|||
return |
|||
from property in dbContextType.GetTypeInfo().GetProperties(BindingFlags.Public | BindingFlags.Instance) |
|||
where |
|||
ReflectionHelper.IsAssignableToGenericType(property.PropertyType, typeof(IMongoCollection<>)) && |
|||
typeof(IEntity).IsAssignableFrom(property.PropertyType.GenericTypeArguments[0]) |
|||
select property.PropertyType.GenericTypeArguments[0]; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,15 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
|
|||
namespace Volo.Abp.MongoDB |
|||
{ |
|||
public class MongoDbContextModel |
|||
{ |
|||
public IReadOnlyDictionary<Type, IMongoEntityModel> Entities { get; } |
|||
|
|||
public MongoDbContextModel(IReadOnlyDictionary<Type, IMongoEntityModel> entities) |
|||
{ |
|||
Entities = entities; |
|||
} |
|||
} |
|||
} |
|||
@ -1,17 +0,0 @@ |
|||
using System; |
|||
|
|||
namespace Volo.Abp.MongoDB |
|||
{ |
|||
public class MongoEntityMapping |
|||
{ |
|||
public Type EntityType { get; set; } |
|||
|
|||
public string CollectionName { get; set; } |
|||
|
|||
public MongoEntityMapping(Type entityType, string collectionName = null) |
|||
{ |
|||
EntityType = entityType; |
|||
CollectionName = collectionName ?? entityType.Name; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,18 @@ |
|||
using System; |
|||
|
|||
namespace Volo.Abp.MongoDB |
|||
{ |
|||
public class MongoEntityModelBuilder : IMongoEntityModel |
|||
{ |
|||
public Type EntityType { get; } |
|||
|
|||
public string CollectionName { get; set; } |
|||
|
|||
public MongoEntityModelBuilder(Type entityType) |
|||
{ |
|||
Check.NotNull(entityType, nameof(entityType)); |
|||
|
|||
EntityType = entityType; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,46 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Collections.Immutable; |
|||
using System.Linq; |
|||
using JetBrains.Annotations; |
|||
|
|||
namespace Volo.Abp.MongoDB |
|||
{ |
|||
public class MongoModelBuilder : IMongoModelBuilder |
|||
{ |
|||
private readonly Dictionary<Type, MongoEntityModelBuilder> _entityModelBuilders; |
|||
|
|||
public MongoModelBuilder() |
|||
{ |
|||
_entityModelBuilders = new Dictionary<Type, MongoEntityModelBuilder>(); |
|||
} |
|||
|
|||
public MongoDbContextModel Build() |
|||
{ |
|||
var entityModels = _entityModelBuilders |
|||
.Select(x => x.Value) |
|||
.ToImmutableDictionary(x => x.EntityType, x => (IMongoEntityModel) x); |
|||
|
|||
return new MongoDbContextModel(entityModels); |
|||
} |
|||
|
|||
public virtual void Entity<TEntity>([NotNull] Action<MongoEntityModelBuilder> buildAction) |
|||
{ |
|||
Entity(typeof(TEntity), buildAction); |
|||
} |
|||
|
|||
public virtual void Entity([NotNull] Type entityType, [NotNull] Action<MongoEntityModelBuilder> buildAction) |
|||
{ |
|||
Check.NotNull(entityType, nameof(entityType)); |
|||
Check.NotNull(buildAction, nameof(buildAction)); |
|||
|
|||
var model = _entityModelBuilders.GetOrAdd(entityType, () => new MongoEntityModelBuilder(entityType)); |
|||
buildAction(model); |
|||
} |
|||
|
|||
public virtual IReadOnlyList<MongoEntityModelBuilder> GetEntities() |
|||
{ |
|||
return _entityModelBuilders.Values.ToImmutableList(); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,26 @@ |
|||
using JetBrains.Annotations; |
|||
|
|||
namespace Volo.Abp.MongoDB |
|||
{ |
|||
public class MongoModelBuilderConfigurationOptions |
|||
{ |
|||
[NotNull] |
|||
public string CollectionPrefix |
|||
{ |
|||
get => _collectionPrefix; |
|||
set |
|||
{ |
|||
Check.NotNull(value, nameof(value), $"{nameof(CollectionPrefix)} can not be null! Set to empty string if you don't want a collection prefix."); |
|||
_collectionPrefix = value; |
|||
} |
|||
} |
|||
private string _collectionPrefix; |
|||
|
|||
public MongoModelBuilderConfigurationOptions([NotNull] string collectionPrefix = "") |
|||
{ |
|||
Check.NotNull(collectionPrefix, nameof(collectionPrefix)); |
|||
|
|||
CollectionPrefix = collectionPrefix; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,68 @@ |
|||
using System; |
|||
using System.Collections.Concurrent; |
|||
using System.Linq; |
|||
using System.Reflection; |
|||
using MongoDB.Driver; |
|||
using Volo.Abp.DependencyInjection; |
|||
using Volo.Abp.Domain.Entities; |
|||
using Volo.Abp.Reflection; |
|||
|
|||
namespace Volo.Abp.MongoDB |
|||
{ |
|||
public class MongoModelSource : IMongoModelSource, ISingletonDependency |
|||
{ |
|||
protected readonly ConcurrentDictionary<Type, MongoDbContextModel> ModelCache = new ConcurrentDictionary<Type, MongoDbContextModel>(); |
|||
|
|||
public virtual MongoDbContextModel GetModel(AbpMongoDbContext dbContext) |
|||
{ |
|||
return ModelCache.GetOrAdd( |
|||
dbContext.GetType(), |
|||
_ => CreateModel(dbContext) |
|||
); |
|||
} |
|||
|
|||
protected virtual MongoDbContextModel CreateModel(AbpMongoDbContext dbContext) |
|||
{ |
|||
var modelBuilder = CreateModelBuilder(); |
|||
BuildModelFromDbContextType(modelBuilder, dbContext.GetType()); |
|||
BuildModelFromDbContextInstance(modelBuilder, dbContext); |
|||
return modelBuilder.Build(); |
|||
} |
|||
|
|||
protected virtual MongoModelBuilder CreateModelBuilder() |
|||
{ |
|||
return new MongoModelBuilder(); |
|||
} |
|||
|
|||
protected virtual void BuildModelFromDbContextType(IMongoModelBuilder modelBuilder, Type dbContextType) |
|||
{ |
|||
var collectionProperties = |
|||
from property in dbContextType.GetTypeInfo().GetProperties(BindingFlags.Public | BindingFlags.Instance) |
|||
where |
|||
ReflectionHelper.IsAssignableToGenericType(property.PropertyType, typeof(IMongoCollection<>)) && |
|||
typeof(IEntity).IsAssignableFrom(property.PropertyType.GenericTypeArguments[0]) |
|||
select property; |
|||
|
|||
foreach (var collectionProperty in collectionProperties) |
|||
{ |
|||
BuildModelFromDbContextCollectionProperty(modelBuilder, collectionProperty); |
|||
} |
|||
} |
|||
|
|||
protected virtual void BuildModelFromDbContextCollectionProperty(IMongoModelBuilder modelBuilder, PropertyInfo collectionProperty) |
|||
{ |
|||
var entityType = collectionProperty.PropertyType.GenericTypeArguments[0]; |
|||
var collectionAttribute = collectionProperty.GetCustomAttributes().OfType<MongoCollectionAttribute>().FirstOrDefault(); |
|||
|
|||
modelBuilder.Entity(entityType, b => |
|||
{ |
|||
b.CollectionName = collectionAttribute?.CollectionName ?? collectionProperty.Name; |
|||
}); |
|||
} |
|||
|
|||
protected virtual void BuildModelFromDbContextInstance(IMongoModelBuilder modelBuilder, AbpMongoDbContext dbContext) |
|||
{ |
|||
dbContext.CreateModel(modelBuilder); |
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue