Completely refactor the Volo.Abp.BlobStoring module.

pull/4164/head
Halil İbrahim Kalkan 5 years ago
parent f43b5ec3d3
commit 98beddfc56

@ -13,8 +13,8 @@
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Volo\Abp\BlobStoring\Database\Localization\Database\*.json" />
<Content Remove="Volo\Abp\BlobStoring\Database\Localization\Database\*.json" />
<EmbeddedResource Include="Volo\Abp\BlobStoring\Database\Localization\*.json" />
<Content Remove="Volo\Abp\BlobStoring\Database\Localization\*.json" />
</ItemGroup>
</Project>

@ -1,9 +0,0 @@
namespace Volo.Abp.BlobStoring.Database
{
public static class BlobConsts
{
public const int MaxNameLength = 256;
public const int MaxContentLength = 2_000_000_000; // 2 GB
}
}

@ -17,7 +17,7 @@ namespace Volo.Abp.BlobStoring.Database
{
Configure<AbpVirtualFileSystemOptions>(options =>
{
options.FileSets.AddEmbedded<BlobStoringDatabaseDomainSharedModule>("Volo.Abp.BlobStoring.Database");
options.FileSets.AddEmbedded<BlobStoringDatabaseDomainSharedModule>();
});
Configure<AbpLocalizationOptions>(options =>
@ -25,7 +25,7 @@ namespace Volo.Abp.BlobStoring.Database
options.Resources
.Add<BlobStoringDatabaseResource>("en")
.AddBaseTypes(typeof(AbpValidationResource))
.AddVirtualJson("/Localization/BlobStoringDatabase");
.AddVirtualJson("/Volo/Abp/BlobStoring/Database/Localization");
});
Configure<AbpExceptionLocalizationOptions>(options =>

@ -0,0 +1,15 @@
namespace Volo.Abp.BlobStoring.Database
{
public static class DatabaseBlobConsts
{
/// <summary>
/// Default value: 256.
/// </summary>
public static int MaxNameLength { get; set; } = 256;
/// <summary>
/// Default value: <see cref="int.MaxValue"/> (2GB).
/// </summary>
public static int MaxContentLength { get; set; } = int.MaxValue;
}
}

@ -5,7 +5,7 @@ using Volo.Abp.MultiTenancy;
namespace Volo.Abp.BlobStoring.Database
{
public class Blob : AggregateRoot<Guid>, IMultiTenant
public class DatabaseBlob : AggregateRoot<Guid>, IMultiTenant
{
public virtual Guid ContainerId { get; protected set; }
@ -15,10 +15,10 @@ namespace Volo.Abp.BlobStoring.Database
public virtual byte[] Content { get; protected set; }
public Blob(Guid id, Guid containerId, [NotNull] string name, [NotNull] byte[] content, Guid? tenantId = null)
public DatabaseBlob(Guid id, Guid containerId, [NotNull] string name, [NotNull] byte[] content, Guid? tenantId = null)
: base(id)
{
Name = Check.NotNullOrWhiteSpace(name, nameof(name), BlobConsts.MaxNameLength);
Name = Check.NotNullOrWhiteSpace(name, nameof(name), DatabaseBlobConsts.MaxNameLength);
ContainerId = containerId;
Content = CheckContentLength(content);
TenantId = tenantId;
@ -33,9 +33,9 @@ namespace Volo.Abp.BlobStoring.Database
{
Check.NotNull(content, nameof(content));
if (content.Length >= BlobConsts.MaxContentLength)
if (content.Length >= DatabaseBlobConsts.MaxContentLength)
{
throw new AbpException($"Blob content size cannot be more than {BlobConsts.MaxContentLength} Bytes.");
throw new AbpException($"Blob content size cannot be more than {DatabaseBlobConsts.MaxContentLength} Bytes.");
}
return content;

@ -5,16 +5,16 @@ using Volo.Abp.MultiTenancy;
namespace Volo.Abp.BlobStoring.Database
{
public class Container : AggregateRoot<Guid>, IMultiTenant //TODO: Rename to BlobContainer
public class DatabaseBlobContainer : AggregateRoot<Guid>, IMultiTenant //TODO: Rename to BlobContainer
{
public virtual Guid? TenantId { get; protected set; }
public virtual string Name { get; protected set; }
public Container(Guid id, [NotNull] string name, Guid? tenantId = null)
public DatabaseBlobContainer(Guid id, [NotNull] string name, Guid? tenantId = null)
: base(id)
{
Name = Check.NotNullOrWhiteSpace(name, nameof(name), ContainerConsts.MaxNameLength);
Name = Check.NotNullOrWhiteSpace(name, nameof(name), DatabaseContainerConsts.MaxNameLength);
TenantId = tenantId;
}
}

@ -1,30 +1,11 @@
using System;
namespace Volo.Abp.BlobStoring.Database
namespace Volo.Abp.BlobStoring.Database
{
public static class DatabaseBlobContainerConfigurationExtensions
{
public static DatabaseBlobProviderConfiguration GetDatabaseConfiguration(
this BlobContainerConfiguration containerConfiguration)
{
return new DatabaseBlobProviderConfiguration(containerConfiguration);
}
public static BlobContainerConfiguration UseDatabase(
this BlobContainerConfiguration containerConfiguration,
Action<DatabaseBlobProviderConfiguration> databaseConfigureAction)
{
containerConfiguration.ProviderType = typeof(DatabaseBlobProvider);
databaseConfigureAction(new DatabaseBlobProviderConfiguration(containerConfiguration));
return containerConfiguration;
}
public static BlobContainerConfiguration UseDatabase(this BlobContainerConfiguration containerConfiguration)
this BlobContainerConfiguration containerConfiguration)
{
containerConfiguration.ProviderType = typeof(DatabaseBlobProvider);
return containerConfiguration;
}
}

@ -1,26 +1,34 @@
using System;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Guids;
namespace Volo.Abp.BlobStoring.Database
{
public class DatabaseBlobProvider : BlobProviderBase, ITransientDependency
{
protected IBlobRepository BlobRepository { get; }
protected IContainerRepository ContainerRepository { get; }
public DatabaseBlobProvider(IBlobRepository blobRepository, IContainerRepository containerRepository)
protected IDatabaseBlobRepository DatabaseBlobRepository { get; }
protected IDatabaseBlobContainerRepository DatabaseBlobContainerRepository { get; }
protected IGuidGenerator GuidGenerator { get; }
public DatabaseBlobProvider(
IDatabaseBlobRepository databaseBlobRepository,
IDatabaseBlobContainerRepository databaseBlobContainerRepository,
IGuidGenerator guidGenerator)
{
BlobRepository = blobRepository;
ContainerRepository = containerRepository;
DatabaseBlobRepository = databaseBlobRepository;
DatabaseBlobContainerRepository = databaseBlobContainerRepository;
GuidGenerator = guidGenerator;
}
public override async Task SaveAsync(BlobProviderSaveArgs args)
{
var container = await ContainerRepository.CreateIfNotExistAsync(args.ContainerName, args.TenantId, args.CancellationToken);
var blob = await BlobRepository.FindAsync(container.Id, args.BlobName, args.TenantId, args.CancellationToken);
var container = await GetOrCreateContainerAsync(args.ContainerName, args.TenantId, args.CancellationToken);
var blob = await DatabaseBlobRepository.FindAsync(container.Id, args.BlobName, args.TenantId,
args.CancellationToken);
var content = await args.BlobStream.GetAllBytesAsync(args.CancellationToken);
@ -28,53 +36,63 @@ namespace Volo.Abp.BlobStoring.Database
{
if (!args.OverrideExisting)
{
throw new BlobAlreadyExistsException($"Saving BLOB '{args.BlobName}' does already exists in the container '{args.ContainerName}'! Set {nameof(args.OverrideExisting)} if it should be overwritten.");
throw new BlobAlreadyExistsException(
$"Saving BLOB '{args.BlobName}' does already exists in the container '{args.ContainerName}'! Set {nameof(args.OverrideExisting)} if it should be overwritten.");
}
blob.SetContent(content);
await BlobRepository.UpdateAsync(blob);
await DatabaseBlobRepository.UpdateAsync(blob);
}
else
{
blob = new Blob(Guid.NewGuid(), container.Id, args.BlobName, content, args.TenantId);
await BlobRepository.InsertAsync(blob);
blob = new DatabaseBlob(GuidGenerator.Create(), container.Id, args.BlobName, content, args.TenantId);
await DatabaseBlobRepository.InsertAsync(blob);
}
}
public override async Task<bool> DeleteAsync(BlobProviderDeleteArgs args)
{
var container = await ContainerRepository.FindAsync(args.ContainerName, args.TenantId, args.CancellationToken);
var container =
await DatabaseBlobContainerRepository.FindAsync(args.ContainerName, args.TenantId,
args.CancellationToken);
if (container == null)
{
return false;
}
return await BlobRepository.DeleteAsync(container.Id, args.BlobName, args.TenantId, args.CancellationToken);
return await DatabaseBlobRepository.DeleteAsync(container.Id, args.BlobName, args.TenantId,
args.CancellationToken);
}
public override async Task<bool> ExistsAsync(BlobProviderExistsArgs args)
{
var container = await ContainerRepository.FindAsync(args.ContainerName, args.TenantId, args.CancellationToken);
var container =
await DatabaseBlobContainerRepository.FindAsync(args.ContainerName, args.TenantId,
args.CancellationToken);
if (container == null)
{
return false;
}
return await BlobRepository.ExistsAsync(container.Id, args.BlobName, args.TenantId, args.CancellationToken);
return await DatabaseBlobRepository.ExistsAsync(container.Id, args.BlobName, args.TenantId,
args.CancellationToken);
}
public override async Task<Stream> GetOrNullAsync(BlobProviderGetArgs args)
{
var container = await ContainerRepository.FindAsync(args.ContainerName, args.TenantId, args.CancellationToken);
var container =
await DatabaseBlobContainerRepository.FindAsync(args.ContainerName, args.TenantId,
args.CancellationToken);
if (container == null)
{
return null;
}
var blob = await BlobRepository.FindAsync(container.Id, args.BlobName, args.TenantId, args.CancellationToken);
var blob = await DatabaseBlobRepository.FindAsync(container.Id, args.BlobName, args.TenantId,
args.CancellationToken);
if (blob == null)
{
@ -83,5 +101,22 @@ namespace Volo.Abp.BlobStoring.Database
return new MemoryStream(blob.Content);
}
protected virtual async Task<DatabaseBlobContainer> GetOrCreateContainerAsync(
string name,
Guid? tenantId = null,
CancellationToken cancellationToken = default)
{
var container = await DatabaseBlobContainerRepository.FindAsync(name, tenantId, cancellationToken);
if (container != null)
{
return container;
}
container = new DatabaseBlobContainer(GuidGenerator.Create(), name, tenantId);
await DatabaseBlobContainerRepository.InsertAsync(container, cancellationToken: cancellationToken);
return container;
}
}
}

@ -1,12 +0,0 @@
namespace Volo.Abp.BlobStoring.Database
{
public class DatabaseBlobProviderConfiguration
{
private readonly BlobContainerConfiguration _containerConfiguration;
public DatabaseBlobProviderConfiguration(BlobContainerConfiguration containerConfiguration)
{
_containerConfiguration = containerConfiguration;
}
}
}

@ -1,15 +0,0 @@
using System;
using System.Threading;
using System.Threading.Tasks;
using JetBrains.Annotations;
using Volo.Abp.Domain.Repositories;
namespace Volo.Abp.BlobStoring.Database
{
public interface IContainerRepository : IBasicRepository<Container, Guid>
{
Task<Container> CreateIfNotExistAsync([NotNull] string name, Guid? tenantId = null, CancellationToken cancellationToken = default);
Task<Container> FindAsync([NotNull] string name, Guid? tenantId = null, CancellationToken cancellationToken = default);
}
}

@ -0,0 +1,13 @@
using System;
using System.Threading;
using System.Threading.Tasks;
using JetBrains.Annotations;
using Volo.Abp.Domain.Repositories;
namespace Volo.Abp.BlobStoring.Database
{
public interface IDatabaseBlobContainerRepository : IBasicRepository<DatabaseBlobContainer, Guid>
{
Task<DatabaseBlobContainer> FindAsync([NotNull] string name, Guid? tenantId = null, CancellationToken cancellationToken = default);
}
}

@ -6,9 +6,9 @@ using Volo.Abp.Domain.Repositories;
namespace Volo.Abp.BlobStoring.Database
{
public interface IBlobRepository : IBasicRepository<Blob, Guid>
public interface IDatabaseBlobRepository : IBasicRepository<DatabaseBlob, Guid>
{
Task<Blob> FindAsync(Guid containerId, [NotNull] string name, Guid? tenantId = null, CancellationToken cancellationToken = default);
Task<DatabaseBlob> FindAsync(Guid containerId, [NotNull] string name, Guid? tenantId = null, CancellationToken cancellationToken = default);
Task<bool> ExistsAsync(Guid containerId, [NotNull] string name, Guid? tenantId = null, CancellationToken cancellationToken = default);

@ -1,47 +0,0 @@
using Microsoft.EntityFrameworkCore;
using System;
using Volo.Abp.EntityFrameworkCore.Modeling;
namespace Volo.Abp.BlobStoring.Database.EntityFrameworkCore
{
public static class BlobStoringDatabaseDbContextModelCreatingExtensions
{
public static void ConfigureDatabaseBlobStoring(
this ModelBuilder builder,
Action<BlobStoringDatabaseModelBuilderConfigurationOptions> optionsAction = null)
{
Check.NotNull(builder, nameof(builder));
var options = new BlobStoringDatabaseModelBuilderConfigurationOptions(
BlobStoringDatabaseDbProperties.DbTablePrefix,
BlobStoringDatabaseDbProperties.DbSchema
);
optionsAction?.Invoke(options);
builder.Entity<Container>(b =>
{
b.ToTable(options.TablePrefix + "Containers", options.Schema);
b.ConfigureByConvention();
b.Property(p => p.Name).IsRequired().HasMaxLength(ContainerConsts.MaxNameLength);
b.HasIndex(x => x.Name);
});
builder.Entity<Blob>(b =>
{
b.ToTable(options.TablePrefix + "Blobs", options.Schema);
b.ConfigureByConvention();
b.Property(p => p.Name).IsRequired().HasMaxLength(BlobConsts.MaxNameLength);
b.Property(p => p.ContainerId).IsRequired();
b.Property(p => p.Content).HasMaxLength(BlobConsts.MaxContentLength);
b.HasIndex(x => x.Name);
});
}
}
}

@ -12,11 +12,11 @@ namespace Volo.Abp.BlobStoring.Database.EntityFrameworkCore
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
context.Services.AddAbpDbContext<BlobStoringDatabaseDbContext>(options =>
context.Services.AddAbpDbContext<BlobStoringDbContext>(options =>
{
options.AddRepository<Container, EfCoreContainerRepository>();
options.AddRepository<DatabaseBlobContainer, EfCoreDatabaseBlobContainerRepository>();
options.AddRepository<Blob, EfCoreBlobRepository>();
options.AddRepository<DatabaseBlob, EfCoreDatabaseBlobRepository>();
});
}
}

@ -5,13 +5,13 @@ using Volo.Abp.EntityFrameworkCore;
namespace Volo.Abp.BlobStoring.Database.EntityFrameworkCore
{
[ConnectionStringName(BlobStoringDatabaseDbProperties.ConnectionStringName)]
public class BlobStoringDatabaseDbContext : AbpDbContext<BlobStoringDatabaseDbContext>, IBlobStoringDatabaseDbContext
public class BlobStoringDbContext : AbpDbContext<BlobStoringDbContext>, IBlobStoringDbContext
{
public DbSet<Container> Containers { get; set; }
public DbSet<DatabaseBlobContainer> BlobContainers { get; set; }
public DbSet<Blob> Blobs { get; set; }
public DbSet<DatabaseBlob> Blobs { get; set; }
public BlobStoringDatabaseDbContext(DbContextOptions<BlobStoringDatabaseDbContext> options)
public BlobStoringDbContext(DbContextOptions<BlobStoringDbContext> options)
: base(options)
{
@ -21,8 +21,7 @@ namespace Volo.Abp.BlobStoring.Database.EntityFrameworkCore
{
base.OnModelCreating(builder);
builder.ConfigureDatabaseBlobStoring();
builder.ConfigureBlobStoring();
}
}
}

@ -0,0 +1,47 @@
using Microsoft.EntityFrameworkCore;
using System;
using Volo.Abp.EntityFrameworkCore.Modeling;
namespace Volo.Abp.BlobStoring.Database.EntityFrameworkCore
{
public static class BlobStoringDbContextModelCreatingExtensions
{
public static void ConfigureBlobStoring(
this ModelBuilder builder,
Action<BlobStoringModelBuilderConfigurationOptions> optionsAction = null)
{
Check.NotNull(builder, nameof(builder));
var options = new BlobStoringModelBuilderConfigurationOptions(
BlobStoringDatabaseDbProperties.DbTablePrefix,
BlobStoringDatabaseDbProperties.DbSchema
);
optionsAction?.Invoke(options);
builder.Entity<DatabaseBlobContainer>(b =>
{
b.ToTable(options.TablePrefix + "BlobContainers", options.Schema);
b.ConfigureByConvention();
b.Property(p => p.Name).IsRequired().HasMaxLength(DatabaseContainerConsts.MaxNameLength);
b.HasIndex(x => new {x.TenantId, x.Name});
});
builder.Entity<DatabaseBlob>(b =>
{
b.ToTable(options.TablePrefix + "Blobs", options.Schema);
b.ConfigureByConvention();
b.Property(p => p.ContainerId).IsRequired(); //TODO: Foreign key!
b.Property(p => p.Name).IsRequired().HasMaxLength(DatabaseBlobConsts.MaxNameLength);
b.Property(p => p.Content).HasMaxLength(DatabaseBlobConsts.MaxContentLength);
b.HasIndex(x => new {x.TenantId, x.ContainerId, x.Name});
});
}
}
}

@ -3,9 +3,9 @@ using Volo.Abp.EntityFrameworkCore.Modeling;
namespace Volo.Abp.BlobStoring.Database.EntityFrameworkCore
{
public class BlobStoringDatabaseModelBuilderConfigurationOptions : AbpModelBuilderConfigurationOptions
public class BlobStoringModelBuilderConfigurationOptions : AbpModelBuilderConfigurationOptions
{
public BlobStoringDatabaseModelBuilderConfigurationOptions(
public BlobStoringModelBuilderConfigurationOptions(
[NotNull] string tablePrefix = "",
[CanBeNull] string schema = null)
: base(

@ -1,47 +0,0 @@
using Microsoft.EntityFrameworkCore;
using System;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.Domain.Repositories.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore;
namespace Volo.Abp.BlobStoring.Database.EntityFrameworkCore
{
public class EfCoreBlobRepository : EfCoreRepository<IBlobStoringDatabaseDbContext, Blob, Guid>, IBlobRepository
{
public EfCoreBlobRepository(IDbContextProvider<IBlobStoringDatabaseDbContext> dbContextProvider) : base(dbContextProvider)
{
}
public virtual async Task<Blob> FindAsync(Guid containerId, string name, Guid? tenantId = null, CancellationToken cancellationToken = default)
{
return await DbSet.FirstOrDefaultAsync(
x => x.ContainerId == containerId &&
x.Name == name &&
x.TenantId == tenantId,
GetCancellationToken(cancellationToken));
}
public virtual async Task<bool> ExistsAsync(Guid containerId, string name, Guid? tenantId = null, CancellationToken cancellationToken = default)
{
return await DbSet.AnyAsync(
x => x.ContainerId == containerId &&
x.Name == name &&
x.TenantId == tenantId,
GetCancellationToken(cancellationToken));
}
public virtual async Task<bool> DeleteAsync(Guid containerId, string name, Guid? tenantId = null, CancellationToken cancellationToken = default)
{
var blob = await FindAsync(containerId, name, tenantId, cancellationToken);
if (blob == null)
{
return false;
}
await base.DeleteAsync(blob.Id, cancellationToken: GetCancellationToken(cancellationToken));
return true;
}
}
}

@ -1,37 +0,0 @@
using Microsoft.EntityFrameworkCore;
using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.Domain.Repositories.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore;
namespace Volo.Abp.BlobStoring.Database.EntityFrameworkCore
{
public class EfCoreContainerRepository : EfCoreRepository<IBlobStoringDatabaseDbContext, Container, Guid>, IContainerRepository
{
public EfCoreContainerRepository(IDbContextProvider<IBlobStoringDatabaseDbContext> dbContextProvider) : base(dbContextProvider)
{
}
public virtual async Task<Container> CreateIfNotExistAsync(string name, Guid? tenantId = null, CancellationToken cancellationToken = default)
{
var container = await FindAsync(name, tenantId, cancellationToken);
if (container != null)
{
return container;
}
container = new Container(Guid.NewGuid(), name, tenantId);
await base.InsertAsync(container, true, GetCancellationToken(cancellationToken));
return container;
}
public virtual async Task<Container> FindAsync(string name, Guid? tenantId = null, CancellationToken cancellationToken = default)
{
return await DbSet.WhereIf(tenantId != null, x => x.TenantId == tenantId)
.FirstOrDefaultAsync(x => x.Name == name, GetCancellationToken(cancellationToken));
}
}
}

@ -0,0 +1,24 @@
using Microsoft.EntityFrameworkCore;
using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.Domain.Repositories.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore;
namespace Volo.Abp.BlobStoring.Database.EntityFrameworkCore
{
public class EfCoreDatabaseBlobContainerRepository : EfCoreRepository<IBlobStoringDbContext, DatabaseBlobContainer, Guid>, IDatabaseBlobContainerRepository
{
public EfCoreDatabaseBlobContainerRepository(IDbContextProvider<IBlobStoringDbContext> dbContextProvider)
: base(dbContextProvider)
{
}
public virtual async Task<DatabaseBlobContainer> FindAsync(string name, Guid? tenantId = null, CancellationToken cancellationToken = default)
{
return await DbSet.WhereIf(tenantId != null, x => x.TenantId == tenantId)
.FirstOrDefaultAsync(x => x.Name == name, GetCancellationToken(cancellationToken));
}
}
}

@ -0,0 +1,58 @@
using Microsoft.EntityFrameworkCore;
using System;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.Domain.Repositories.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore;
namespace Volo.Abp.BlobStoring.Database.EntityFrameworkCore
{
public class EfCoreDatabaseBlobRepository : EfCoreRepository<IBlobStoringDbContext, DatabaseBlob, Guid>, IDatabaseBlobRepository
{
public EfCoreDatabaseBlobRepository(IDbContextProvider<IBlobStoringDbContext> dbContextProvider)
: base(dbContextProvider)
{
}
public virtual async Task<DatabaseBlob> FindAsync(
Guid containerId,
string name,
Guid? tenantId = null,
CancellationToken cancellationToken = default)
{
return await DbSet.FirstOrDefaultAsync(
x => x.ContainerId == containerId && x.Name == name && x.TenantId == tenantId,
GetCancellationToken(cancellationToken)
);
}
public virtual async Task<bool> ExistsAsync(
Guid containerId,
string name,
Guid? tenantId = null,
CancellationToken cancellationToken = default)
{
return await DbSet.AnyAsync(
x => x.ContainerId == containerId &&
x.Name == name &&
x.TenantId == tenantId,
GetCancellationToken(cancellationToken));
}
public virtual async Task<bool> DeleteAsync(
Guid containerId,
string name,
Guid? tenantId = null,
CancellationToken cancellationToken = default)
{
var blob = await FindAsync(containerId, name, tenantId, cancellationToken);
if (blob == null)
{
return false;
}
await base.DeleteAsync(blob.Id, cancellationToken: GetCancellationToken(cancellationToken));
return true;
}
}
}

@ -5,10 +5,10 @@ using Volo.Abp.EntityFrameworkCore;
namespace Volo.Abp.BlobStoring.Database.EntityFrameworkCore
{
[ConnectionStringName(BlobStoringDatabaseDbProperties.ConnectionStringName)]
public interface IBlobStoringDatabaseDbContext : IEfCoreDbContext
public interface IBlobStoringDbContext : IEfCoreDbContext
{
DbSet<Container> Containers { get; }
DbSet<DatabaseBlobContainer> BlobContainers { get; }
DbSet<Blob> Blobs { get; }
DbSet<DatabaseBlob> Blobs { get; }
}
}

@ -12,10 +12,10 @@ namespace Volo.Abp.BlobStoring.Database.MongoDB
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
context.Services.AddMongoDbContext<BlobStoringDatabaseMongoDbContext>(options =>
context.Services.AddMongoDbContext<BlobStoringMongoDbContext>(options =>
{
options.AddRepository<Container, MongoDbContainerRepository>();
options.AddRepository<Blob, MongoDbBlobRepository>();
options.AddRepository<DatabaseBlobContainer, MongoDbDatabaseBlobContainerRepository>();
options.AddRepository<DatabaseBlob, MongoDbDatabaseBlobRepository>();
});
}
}

@ -5,17 +5,17 @@ using Volo.Abp.MongoDB;
namespace Volo.Abp.BlobStoring.Database.MongoDB
{
[ConnectionStringName(BlobStoringDatabaseDbProperties.ConnectionStringName)]
public class BlobStoringDatabaseMongoDbContext : AbpMongoDbContext, IBlobStoringDatabaseMongoDbContext
public class BlobStoringMongoDbContext : AbpMongoDbContext, IBlobStoringMongoDbContext
{
public IMongoCollection<Container> Containers => Collection<Container>();
public IMongoCollection<DatabaseBlobContainer> BlobContainers => Collection<DatabaseBlobContainer>();
public IMongoCollection<Blob> Blobs => Collection<Blob>();
public IMongoCollection<DatabaseBlob> Blobs => Collection<DatabaseBlob>();
protected override void CreateModel(IMongoModelBuilder modelBuilder)
{
base.CreateModel(modelBuilder);
modelBuilder.ConfigureDatabaseBlobStoring();
modelBuilder.ConfigureBlobStoring();
}
}
}

@ -3,26 +3,26 @@ using Volo.Abp.MongoDB;
namespace Volo.Abp.BlobStoring.Database.MongoDB
{
public static class BlobStoringDatabaseMongoDbContextExtensions
public static class BlobStoringMongoDbContextExtensions
{
public static void ConfigureDatabaseBlobStoring(
public static void ConfigureBlobStoring(
this IMongoModelBuilder builder,
Action<AbpMongoModelBuilderConfigurationOptions> optionsAction = null)
{
Check.NotNull(builder, nameof(builder));
var options = new BlobStoringDatabaseMongoModelBuilderConfigurationOptions(
var options = new BlobStoringMongoModelBuilderConfigurationOptions(
BlobStoringDatabaseDbProperties.DbTablePrefix
);
optionsAction?.Invoke(options);
builder.Entity<Container>(b =>
builder.Entity<DatabaseBlobContainer>(b =>
{
b.CollectionName = options.CollectionPrefix + "Containers";
b.CollectionName = options.CollectionPrefix + "BlobContainers";
});
builder.Entity<Blob>(b =>
builder.Entity<DatabaseBlob>(b =>
{
b.CollectionName = options.CollectionPrefix + "Blobs";
});

@ -3,9 +3,9 @@ using Volo.Abp.MongoDB;
namespace Volo.Abp.BlobStoring.Database.MongoDB
{
public class BlobStoringDatabaseMongoModelBuilderConfigurationOptions : AbpMongoModelBuilderConfigurationOptions
public class BlobStoringMongoModelBuilderConfigurationOptions : AbpMongoModelBuilderConfigurationOptions
{
public BlobStoringDatabaseMongoModelBuilderConfigurationOptions(
public BlobStoringMongoModelBuilderConfigurationOptions(
[NotNull] string collectionPrefix = "")
: base(collectionPrefix)
{

@ -5,10 +5,10 @@ using Volo.Abp.MongoDB;
namespace Volo.Abp.BlobStoring.Database.MongoDB
{
[ConnectionStringName(BlobStoringDatabaseDbProperties.ConnectionStringName)]
public interface IBlobStoringDatabaseMongoDbContext : IAbpMongoDbContext
public interface IBlobStoringMongoDbContext : IAbpMongoDbContext
{
IMongoCollection<Container> Containers { get; }
IMongoCollection<DatabaseBlobContainer> BlobContainers { get; }
IMongoCollection<Blob> Blobs { get; }
IMongoCollection<DatabaseBlob> Blobs { get; }
}
}

@ -1,35 +0,0 @@
using System;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.Domain.Repositories.MongoDB;
using Volo.Abp.MongoDB;
namespace Volo.Abp.BlobStoring.Database.MongoDB
{
public class MongoDbContainerRepository : MongoDbRepository<IBlobStoringDatabaseMongoDbContext, Container, Guid>, IContainerRepository
{
public MongoDbContainerRepository(IMongoDbContextProvider<IBlobStoringDatabaseMongoDbContext> dbContextProvider) : base(dbContextProvider)
{
}
public virtual async Task<Container> CreateIfNotExistAsync(string name, Guid? tenantId = null, CancellationToken cancellationToken = default)
{
var container = await FindAsync(name, tenantId, cancellationToken);
if (container != null)
{
return container;
}
container = new Container(Guid.NewGuid(), name, tenantId);
await InsertAsync(container, true, GetCancellationToken(cancellationToken));
return container;
}
public virtual async Task<Container> FindAsync(string name, Guid? tenantId = null, CancellationToken cancellationToken = default)
{
return await base.FindAsync(x => x.Name == name, cancellationToken: GetCancellationToken(cancellationToken));
}
}
}

@ -0,0 +1,21 @@
using System;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.Domain.Repositories.MongoDB;
using Volo.Abp.MongoDB;
namespace Volo.Abp.BlobStoring.Database.MongoDB
{
public class MongoDbDatabaseBlobContainerRepository : MongoDbRepository<IBlobStoringMongoDbContext, DatabaseBlobContainer, Guid>, IDatabaseBlobContainerRepository
{
public MongoDbDatabaseBlobContainerRepository(IMongoDbContextProvider<IBlobStoringMongoDbContext> dbContextProvider)
: base(dbContextProvider)
{
}
public virtual async Task<DatabaseBlobContainer> FindAsync(string name, Guid? tenantId = null, CancellationToken cancellationToken = default)
{
return await base.FindAsync(x => x.Name == name && x.TenantId == tenantId, cancellationToken: GetCancellationToken(cancellationToken));
}
}
}

@ -7,13 +7,13 @@ using Volo.Abp.MongoDB;
namespace Volo.Abp.BlobStoring.Database.MongoDB
{
public class MongoDbBlobRepository : MongoDbRepository<IBlobStoringDatabaseMongoDbContext, Blob, Guid>, IBlobRepository
public class MongoDbDatabaseBlobRepository : MongoDbRepository<IBlobStoringMongoDbContext, DatabaseBlob, Guid>, IDatabaseBlobRepository
{
public MongoDbBlobRepository(IMongoDbContextProvider<IBlobStoringDatabaseMongoDbContext> dbContextProvider) : base(dbContextProvider)
public MongoDbDatabaseBlobRepository(IMongoDbContextProvider<IBlobStoringMongoDbContext> dbContextProvider) : base(dbContextProvider)
{
}
public virtual async Task<Blob> FindAsync(Guid containerId, string name, Guid? tenantId = null, CancellationToken cancellationToken = default)
public virtual async Task<DatabaseBlob> FindAsync(Guid containerId, string name, Guid? tenantId = null, CancellationToken cancellationToken = default)
{
return await GetMongoQueryable().FirstOrDefaultAsync(
x => x.ContainerId == containerId &&

@ -31,8 +31,8 @@ namespace Volo.Abp.BlobStoring.Database.EntityFrameworkCore
var connection = new SqliteConnection("Data Source=:memory:");
connection.Open();
new BlobStoringDatabaseDbContext(
new DbContextOptionsBuilder<BlobStoringDatabaseDbContext>().UseSqlite(connection).Options
new BlobStoringDbContext(
new DbContextOptionsBuilder<BlobStoringDbContext>().UseSqlite(connection).Options
).GetService<IRelationalDatabaseCreator>().CreateTables();
return connection;

Loading…
Cancel
Save