Browse Source

Implementing replacing a dbcontext.

pull/189/head
Halil İbrahim Kalkan 8 years ago
parent
commit
f768922ce5
  1. 3
      src/AbpDesk/AbpDesk.EntityFrameworkCore/AbpDesk/EntityFrameworkCore/AbpDeskEntityFrameworkCoreModule.cs
  2. 2
      src/AbpDesk/AbpDesk.MongoBlog/AbpDesk/Blogging/AbpDeskMongoBlogModule.cs
  3. BIN
      src/AbpDesk/Web_PlugIns/AbpDesk.MongoBlog.dll
  4. 55
      src/Volo.Abp.Ddd/Volo/Abp/DependencyInjection/CommonDbContextRegistrationOptions.cs
  5. 40
      src/Volo.Abp.Ddd/Volo/Abp/DependencyInjection/ICommonDbContextRegistrationOptionsBuilder.cs
  6. 17
      src/Volo.Abp.Ddd/Volo/Abp/Domain/Repositories/RepositoryRegistrarBase.cs
  7. 16
      src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/AbpEfCoreServiceCollectionExtensions.cs
  8. 5
      src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DependencyInjection/AbpDbContextRegistrationOptions.cs
  9. 2
      src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DependencyInjection/IAbpDbContextRegistrationOptionsBuilder.cs
  10. 6
      src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/AbpIdentityEntityFrameworkCoreModule.cs
  11. 4
      src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/AbpIdentityServerModule.cs
  12. 15
      src/Volo.Abp.MemoryDb/Microsoft/Extensions/DependencyInjection/AbpMemoryDbServiceCollectionExtensions.cs
  13. 1
      src/Volo.Abp.MemoryDb/Volo/Abp/MemoryDb/DependencyInjection/IMemoryDbContextRegistrationOptionsBuilder.cs
  14. 7
      src/Volo.Abp.MemoryDb/Volo/Abp/MemoryDb/DependencyInjection/MemoryDbContextRegistrationOptions.cs
  15. 17
      src/Volo.Abp.MongoDB/Microsoft/Extensions/DependencyInjection/AbpMongoDbServiceCollectionExtensions.cs
  16. 7
      src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/DependencyInjection/MongoDbContextRegistrationOptions.cs
  17. 2
      src/Volo.Abp.MultiTenancy.EntityFrameworkCore/Volo/Abp/MultiTenancy/EntityFrameworkCore/AbpMultiTenancyEntityFrameworkCoreModule.cs
  18. 33
      test/Volo.Abp.Ddd.Tests/Volo/Abp/Domain/Repositories/RepositoryRegistration_Tests.cs
  19. 11
      test/Volo.Abp.EntityFrameworkCore.Tests.SecondContext/Volo/Abp/EntityFrameworkCore/TestApp/SecondContext/AbpEfCoreTestSecondContextModule.cs
  20. 9
      test/Volo.Abp.EntityFrameworkCore.Tests.SecondContext/Volo/Abp/EntityFrameworkCore/TestApp/ThirdDbContext/IThirdDbContext.cs
  21. 16
      test/Volo.Abp.EntityFrameworkCore.Tests.SecondContext/Volo/Abp/EntityFrameworkCore/TestApp/ThirdDbContext/ThirdDbContext.cs
  22. 9
      test/Volo.Abp.EntityFrameworkCore.Tests.SecondContext/Volo/Abp/EntityFrameworkCore/TestApp/ThirdDbContext/ThirdDbContextDummyEntity.cs
  23. 9
      test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/AbpEntityFrameworkCoreTestModule.cs
  24. 28
      test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/DbContext_Replace_Tests.cs
  25. 7
      test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/TestApp/EntityFrameworkCore/TestAppDbContext.cs
  26. 2
      test/Volo.Abp.MemoryDb.Tests/Volo/Abp/MemoryDb/AbpMemoryDbTestModule.cs
  27. 1
      test/Volo.Abp.TestApp/Volo/Abp/TestApp/TestAppModule.cs

3
src/AbpDesk/AbpDesk.EntityFrameworkCore/AbpDesk/EntityFrameworkCore/AbpDeskEntityFrameworkCoreModule.cs

@ -16,7 +16,8 @@ namespace AbpDesk.EntityFrameworkCore
{
services.AddAbpDbContext<AbpDeskDbContext>(options =>
{
options.WithDefaultRepositories();
options.AddDefaultRepositories();
options.ReplaceDbContext<IMultiTenancyDbContext>();
});
services.AddAssemblyOf<AbpDeskEntityFrameworkCoreModule>();

2
src/AbpDesk/AbpDesk.MongoBlog/AbpDesk/Blogging/AbpDeskMongoBlogModule.cs

@ -20,7 +20,7 @@ namespace AbpDesk.Blogging
{
services.AddMongoDbContext<AbpDeskMongoDbContext>(options =>
{
options.WithDefaultRepositories();
options.AddDefaultRepositories();
});
services.Configure<VirtualFileSystemOptions>(options =>

BIN
src/AbpDesk/Web_PlugIns/AbpDesk.MongoBlog.dll

Binary file not shown.

55
src/Volo.Abp.Ddd/Volo/Abp/DependencyInjection/CommonDbContextRegistrationOptions.cs

@ -12,8 +12,12 @@ namespace Volo.Abp.DependencyInjection
/// </summary>
public abstract class CommonDbContextRegistrationOptions : ICommonDbContextRegistrationOptionsBuilder
{
public bool SpecifiedDefaultRepositoryTypes => DefaultRepositoryImplementationType != null && DefaultRepositoryImplementationTypeWithDefaultPrimaryKey != null;
public Type OriginalDbContextType { get; }
public List<Type> ReplacedDbContextTypes { get; }
public Type DefaultRepositoryDbContextType { get; protected set; }
public Type DefaultRepositoryImplementationType { get; private set; }
public Type DefaultRepositoryImplementationTypeWithDefaultPrimaryKey { get; private set; }
@ -24,12 +28,34 @@ namespace Volo.Abp.DependencyInjection
public Dictionary<Type, Type> CustomRepositories { get; }
public CommonDbContextRegistrationOptions()
public bool SpecifiedDefaultRepositoryTypes => DefaultRepositoryImplementationType != null && DefaultRepositoryImplementationTypeWithDefaultPrimaryKey != null;
protected CommonDbContextRegistrationOptions(Type originalDbContextType)
{
OriginalDbContextType = originalDbContextType;
DefaultRepositoryDbContextType = originalDbContextType;
CustomRepositories = new Dictionary<Type, Type>();
ReplacedDbContextTypes = new List<Type>();
}
public ICommonDbContextRegistrationOptionsBuilder ReplaceDbContext<TOtherDbContext>()
{
return ReplaceDbContext(typeof(TOtherDbContext));
}
public ICommonDbContextRegistrationOptionsBuilder ReplaceDbContext(Type otherDbContextType)
{
if (!otherDbContextType.IsAssignableFrom(OriginalDbContextType))
{
throw new AbpException($"{OriginalDbContextType.AssemblyQualifiedName} should inherit/implement {otherDbContextType.AssemblyQualifiedName}!");
}
ReplacedDbContextTypes.Add(otherDbContextType);
return this;
}
public ICommonDbContextRegistrationOptionsBuilder WithDefaultRepositories(bool includeAllEntities = false)
public ICommonDbContextRegistrationOptionsBuilder AddDefaultRepositories(bool includeAllEntities = false)
{
RegisterDefaultRepositories = true;
IncludeAllEntitiesForDefaultRepositories = includeAllEntities;
@ -37,14 +63,31 @@ namespace Volo.Abp.DependencyInjection
return this;
}
public ICommonDbContextRegistrationOptionsBuilder WithCustomRepository<TEntity, TRepository>()
public ICommonDbContextRegistrationOptionsBuilder AddDefaultRepositories<TDefaultRepositoryDbContext>(bool includeAllEntities = false)
{
return AddDefaultRepositories(typeof(TDefaultRepositoryDbContext), includeAllEntities);
}
public ICommonDbContextRegistrationOptionsBuilder AddDefaultRepositories(Type defaultRepositoryDbContextType, bool includeAllEntities = false)
{
if (!defaultRepositoryDbContextType.IsAssignableFrom(OriginalDbContextType))
{
throw new AbpException($"{OriginalDbContextType.AssemblyQualifiedName} should inherit/implement {defaultRepositoryDbContextType.AssemblyQualifiedName}!");
}
DefaultRepositoryDbContextType = defaultRepositoryDbContextType;
return this;
}
public ICommonDbContextRegistrationOptionsBuilder AddCustomRepository<TEntity, TRepository>()
{
WithCustomRepository(typeof(TEntity), typeof(TRepository));
return this;
}
public ICommonDbContextRegistrationOptionsBuilder WithDefaultRepositoryClasses([NotNull] Type repositoryImplementationType, [NotNull] Type repositoryImplementationTypeWithDefaultPrimaryKey)
public ICommonDbContextRegistrationOptionsBuilder SetDefaultRepositoryClasses([NotNull] Type repositoryImplementationType, [NotNull] Type repositoryImplementationTypeWithDefaultPrimaryKey)
{
Check.NotNull(repositoryImplementationType, nameof(repositoryImplementationType));
Check.NotNull(repositoryImplementationTypeWithDefaultPrimaryKey, nameof(repositoryImplementationTypeWithDefaultPrimaryKey));

40
src/Volo.Abp.Ddd/Volo/Abp/DependencyInjection/ICommonDbContextRegistrationOptionsBuilder.cs

@ -11,7 +11,29 @@ namespace Volo.Abp.DependencyInjection
/// Registers repositories only for aggregate root entities by default.
/// set <see cref="includeAllEntities"/> to true to include all entities.
/// </param>
ICommonDbContextRegistrationOptionsBuilder WithDefaultRepositories(bool includeAllEntities = false);
ICommonDbContextRegistrationOptionsBuilder AddDefaultRepositories(bool includeAllEntities = false);
/// <summary>
/// Registers default repositories for this DbContext.
/// Default repositories will use given <see cref="TDefaultRepositoryDbContext"/>.
/// </summary>
/// <typeparam name="TDefaultRepositoryDbContext">DbContext type that will be used by default repositories</typeparam>
/// <param name="includeAllEntities">
/// Registers repositories only for aggregate root entities by default.
/// set <see cref="includeAllEntities"/> to true to include all entities.
/// </param>
ICommonDbContextRegistrationOptionsBuilder AddDefaultRepositories<TDefaultRepositoryDbContext>(bool includeAllEntities = false);
/// <summary>
/// Registers default repositories for this DbContext.
/// Default repositories will use given <see cref="defaultRepositoryDbContextType"/>.
/// </summary>
/// <param name="defaultRepositoryDbContextType">DbContext type that will be used by default repositories</param>
/// <param name="includeAllEntities">
/// Registers repositories only for aggregate root entities by default.
/// set <see cref="includeAllEntities"/> to true to include all entities.
/// </param>
ICommonDbContextRegistrationOptionsBuilder AddDefaultRepositories(Type defaultRepositoryDbContextType, bool includeAllEntities = false);
/// <summary>
/// Registers custom repository for a specific entity.
@ -19,7 +41,7 @@ namespace Volo.Abp.DependencyInjection
/// </summary>
/// <typeparam name="TEntity">Entity type</typeparam>
/// <typeparam name="TRepository">Repository type</typeparam>
ICommonDbContextRegistrationOptionsBuilder WithCustomRepository<TEntity, TRepository>();
ICommonDbContextRegistrationOptionsBuilder AddCustomRepository<TEntity, TRepository>();
/// <summary>
/// Uses given class(es) for default repositories.
@ -27,6 +49,18 @@ namespace Volo.Abp.DependencyInjection
/// <param name="repositoryImplementationType">Repository implementation type</param>
/// <param name="repositoryImplementationTypeWithDefaultPrimaryKey">Repository implementation type for default primary key type (<see cref="string"/>)</param>
/// <returns></returns>
ICommonDbContextRegistrationOptionsBuilder WithDefaultRepositoryClasses(Type repositoryImplementationType, Type repositoryImplementationTypeWithDefaultPrimaryKey);
ICommonDbContextRegistrationOptionsBuilder SetDefaultRepositoryClasses(Type repositoryImplementationType, Type repositoryImplementationTypeWithDefaultPrimaryKey);
/// <summary>
/// Replaces given DbContext type with this DbContext type.
/// </summary>
/// <typeparam name="TOtherDbContext">The DbContext type to be replaced</typeparam>
ICommonDbContextRegistrationOptionsBuilder ReplaceDbContext<TOtherDbContext>();
/// <summary>
/// Replaces given DbContext type with this DbContext type.
/// </summary>
/// <param name="otherDbContextType">The DbContext type to be replaced</param>
ICommonDbContextRegistrationOptionsBuilder ReplaceDbContext(Type otherDbContextType);
}
}

17
src/Volo.Abp.Ddd/Volo/Abp/Domain/Repositories/RepositoryRegistrarBase.cs

@ -1,7 +1,6 @@
using System;
using System.Collections.Generic;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Data;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Domain.Entities;
using Volo.Abp.Reflection;
@ -18,7 +17,7 @@ namespace Volo.Abp.Domain.Repositories
Options = options;
}
public virtual void AddRepositories(IServiceCollection services, Type dbContextType)
public virtual void AddRepositories(IServiceCollection services)
{
foreach (var customRepository in Options.CustomRepositories)
{
@ -27,24 +26,24 @@ namespace Volo.Abp.Domain.Repositories
if (Options.RegisterDefaultRepositories)
{
RegisterDefaultRepositories(services, dbContextType);
RegisterDefaultRepositories(services);
}
}
protected virtual void RegisterDefaultRepositories(IServiceCollection services, Type dbContextType)
protected virtual void RegisterDefaultRepositories(IServiceCollection services)
{
foreach (var entityType in GetEntityTypes(dbContextType))
foreach (var entityType in GetEntityTypes(Options.DefaultRepositoryDbContextType))
{
if (!ShouldRegisterDefaultRepositoryFor(entityType))
{
continue;
}
RegisterDefaultRepository(services, dbContextType, entityType);
RegisterDefaultRepository(services, entityType);
}
}
protected void RegisterDefaultRepository(IServiceCollection services, Type dbContextType, Type entityType)
protected void RegisterDefaultRepository(IServiceCollection services, Type entityType)
{
var primaryKeyType = EntityHelper.GetPrimaryKeyType(entityType);
var isDefaultPrimaryKey = primaryKeyType == typeof(Guid);
@ -59,8 +58,8 @@ namespace Volo.Abp.Domain.Repositories
else
{
repositoryImplementationType = isDefaultPrimaryKey
? GetRepositoryTypeForDefaultPk(dbContextType, entityType)
: GetRepositoryType(dbContextType, entityType, primaryKeyType);
? GetRepositoryTypeForDefaultPk(Options.DefaultRepositoryDbContextType, entityType)
: GetRepositoryType(Options.DefaultRepositoryDbContextType, entityType, primaryKeyType);
}
services.AddDefaultRepository(entityType, repositoryImplementationType);

16
src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/AbpEfCoreServiceCollectionExtensions.cs

@ -14,14 +14,24 @@ namespace Microsoft.Extensions.DependencyInjection
{
services.AddMemoryCache();
var options = new AbpDbContextRegistrationOptions(typeof(TDbContext));
optionsBuilder?.Invoke(options);
services.TryAddTransient<TDbContext>();
services.TryAddTransient(DbContextOptionsFactory.Create<TDbContext>);
var options = new AbpDbContextRegistrationOptions();
optionsBuilder?.Invoke(options);
if (options.DefaultRepositoryDbContextType != typeof(TDbContext))
{
services.TryAddTransient(options.DefaultRepositoryDbContextType, typeof(TDbContext));
}
foreach (var dbContextType in options.ReplacedDbContextTypes)
{
services.Replace(ServiceDescriptor.Transient(dbContextType, typeof(TDbContext)));
}
new EfCoreRepositoryRegistrar(options)
.AddRepositories(services, typeof(TDbContext));
.AddRepositories(services);
return services;
}

5
src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DependencyInjection/AbpDbContextRegistrationOptions.cs

@ -1,9 +1,14 @@
using System;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.EntityFrameworkCore.DependencyInjection
{
public class AbpDbContextRegistrationOptions : CommonDbContextRegistrationOptions, IAbpDbContextRegistrationOptionsBuilder
{
public AbpDbContextRegistrationOptions(Type originalDbContextType)
: base(originalDbContextType)
{
}
}
}

2
src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DependencyInjection/IAbpDbContextRegistrationOptionsBuilder.cs

@ -1,10 +1,8 @@
using Volo.Abp.Data;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.EntityFrameworkCore.DependencyInjection
{
public interface IAbpDbContextRegistrationOptionsBuilder : ICommonDbContextRegistrationOptionsBuilder
{
}
}

6
src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/AbpIdentityEntityFrameworkCoreModule.cs

@ -11,9 +11,9 @@ namespace Volo.Abp.Identity.EntityFrameworkCore
{
services.AddAbpDbContext<IdentityDbContext>(options =>
{
options.WithDefaultRepositories();
options.WithCustomRepository<IdentityUser, EfCoreIdentityUserRepository>();
options.WithCustomRepository<IdentityRole, EfCoreIdentityRoleRepository>();
options.AddDefaultRepositories();
options.AddCustomRepository<IdentityUser, EfCoreIdentityUserRepository>();
options.AddCustomRepository<IdentityRole, EfCoreIdentityRoleRepository>();
});
services.AddAssemblyOf<AbpIdentityEntityFrameworkCoreModule>();

4
src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/AbpIdentityServerModule.cs

@ -13,8 +13,8 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore
{
services.AddAbpDbContext<IdentityServerDbContext>(options =>
{
options.WithDefaultRepositories();
options.WithCustomRepository<Client, ClientRepository>();
options.AddDefaultRepositories();
options.AddCustomRepository<Client, ClientRepository>();
});
services.AddAssemblyOf<AbpIdentityServerEntityFrameworkCoreModule>();

15
src/Volo.Abp.MemoryDb/Microsoft/Extensions/DependencyInjection/AbpMemoryDbServiceCollectionExtensions.cs

@ -1,4 +1,5 @@
using System;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Volo.Abp.MemoryDb;
using Volo.Abp.MemoryDb.DependencyInjection;
@ -9,13 +10,23 @@ namespace Microsoft.Extensions.DependencyInjection
public static IServiceCollection AddMemoryDbContext<TMemoryDbContext>(this IServiceCollection services, Action<IMemoryDbContextRegistrationOptionsBuilder> optionsBuilder = null)
where TMemoryDbContext : MemoryDbContext
{
var options = new MemoryDbContextRegistrationOptions();
var options = new MemoryDbContextRegistrationOptions(typeof(TMemoryDbContext));
optionsBuilder?.Invoke(options);
services.AddSingleton<TMemoryDbContext>();
if (options.DefaultRepositoryDbContextType != typeof(TMemoryDbContext))
{
services.TryAddSingleton(options.DefaultRepositoryDbContextType, sp => sp.GetRequiredService<TMemoryDbContext>());
}
foreach (var dbContextType in options.ReplacedDbContextTypes)
{
services.Replace(ServiceDescriptor.Singleton(dbContextType, sp => sp.GetRequiredService<TMemoryDbContext>()));
}
new MemoryDbRepositoryRegistrar(options)
.AddRepositories(services, typeof(TMemoryDbContext));
.AddRepositories(services);
return services;
}

1
src/Volo.Abp.MemoryDb/Volo/Abp/MemoryDb/DependencyInjection/IMemoryDbContextRegistrationOptionsBuilder.cs

@ -1,4 +1,3 @@
using Volo.Abp.Data;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.MemoryDb.DependencyInjection

7
src/Volo.Abp.MemoryDb/Volo/Abp/MemoryDb/DependencyInjection/MemoryDbContextRegistrationOptions.cs

@ -1,10 +1,13 @@
using Volo.Abp.Data;
using System;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.MemoryDb.DependencyInjection
{
public class MemoryDbContextRegistrationOptions : CommonDbContextRegistrationOptions, IMemoryDbContextRegistrationOptionsBuilder
{
public MemoryDbContextRegistrationOptions(Type originalDbContextType)
: base(originalDbContextType)
{
}
}
}

17
src/Volo.Abp.MongoDB/Microsoft/Extensions/DependencyInjection/AbpMongoDbServiceCollectionExtensions.cs

@ -1,4 +1,5 @@
using System;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Volo.Abp.MongoDB;
using Volo.Abp.MongoDB.DependencyInjection;
@ -9,13 +10,23 @@ namespace Microsoft.Extensions.DependencyInjection
public static IServiceCollection AddMongoDbContext<TMongoDbContext>(this IServiceCollection services, Action<IMongoDbContextRegistrationOptionsBuilder> optionsBuilder = null) //Created overload instead of default parameter
where TMongoDbContext : AbpMongoDbContext
{
var options = new MongoDbContextRegistrationOptions();
var options = new MongoDbContextRegistrationOptions(typeof(TMongoDbContext));
optionsBuilder?.Invoke(options);
services.AddSingleton<TMongoDbContext>();
services.TryAddSingleton<TMongoDbContext>();
if (options.DefaultRepositoryDbContextType != typeof(TMongoDbContext))
{
services.TryAddSingleton(options.DefaultRepositoryDbContextType, sp => sp.GetRequiredService<TMongoDbContext>());
}
foreach (var dbContextType in options.ReplacedDbContextTypes)
{
services.Replace(ServiceDescriptor.Singleton(dbContextType, sp => sp.GetRequiredService<TMongoDbContext>()));
}
new MongoDbRepositoryRegistrar(options)
.AddRepositories(services, typeof(TMongoDbContext));
.AddRepositories(services);
return services;
}

7
src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/DependencyInjection/MongoDbContextRegistrationOptions.cs

@ -1,10 +1,13 @@
using Volo.Abp.Data;
using System;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.MongoDB.DependencyInjection
{
public class MongoDbContextRegistrationOptions : CommonDbContextRegistrationOptions, IMongoDbContextRegistrationOptionsBuilder
{
public MongoDbContextRegistrationOptions(Type originalDbContextType)
: base(originalDbContextType)
{
}
}
}

2
src/Volo.Abp.MultiTenancy.EntityFrameworkCore/Volo/Abp/MultiTenancy/EntityFrameworkCore/AbpMultiTenancyEntityFrameworkCoreModule.cs

@ -12,7 +12,7 @@ namespace Volo.Abp.MultiTenancy.EntityFrameworkCore
{
services.AddAbpDbContext<MultiTenancyDbContext>(options =>
{
options.WithDefaultRepositories();
options.AddDefaultRepositories<IMultiTenancyDbContext>();
});
services.AddAssemblyOf<AbpMultiTenancyEntityFrameworkCoreModule>();

33
test/Volo.Abp.Ddd.Tests/Volo/Abp/Domain/Repositories/RepositoryRegistration_Tests.cs

@ -17,12 +17,12 @@ namespace Volo.Abp.Domain.Repositories
var services = new ServiceCollection();
var options = new TestDbContextRegistrationOptions();
options.WithDefaultRepositories();
var options = new TestDbContextRegistrationOptions(typeof(MyFakeDbContext));
options.AddDefaultRepositories();
//Act
new MyTestRepositoryRegistrar(options).AddRepositories(services, typeof(MyFakeDbContext));
new MyTestRepositoryRegistrar(options).AddRepositories(services);
//Assert
@ -38,12 +38,12 @@ namespace Volo.Abp.Domain.Repositories
var services = new ServiceCollection();
var options = new TestDbContextRegistrationOptions();
options.WithDefaultRepositories(true);
var options = new TestDbContextRegistrationOptions(typeof(MyFakeDbContext));
options.AddDefaultRepositories(true);
//Act
new MyTestRepositoryRegistrar(options).AddRepositories(services, typeof(MyFakeDbContext));
new MyTestRepositoryRegistrar(options).AddRepositories(services);
//Assert
@ -59,14 +59,14 @@ namespace Volo.Abp.Domain.Repositories
var services = new ServiceCollection();
var options = new TestDbContextRegistrationOptions();
var options = new TestDbContextRegistrationOptions(typeof(MyFakeDbContext));
options
.WithDefaultRepositories(true)
.WithCustomRepository<MyTestAggregateRootWithDefaultPk, MyTestAggregateRootWithDefaultPkCustomRepository>();
.AddDefaultRepositories(true)
.AddCustomRepository<MyTestAggregateRootWithDefaultPk, MyTestAggregateRootWithDefaultPkCustomRepository>();
//Act
new MyTestRepositoryRegistrar(options).AddRepositories(services, typeof(MyFakeDbContext));
new MyTestRepositoryRegistrar(options).AddRepositories(services);
//Assert
@ -82,14 +82,14 @@ namespace Volo.Abp.Domain.Repositories
var services = new ServiceCollection();
var options = new TestDbContextRegistrationOptions();
var options = new TestDbContextRegistrationOptions(typeof(MyFakeDbContext));
options
.WithDefaultRepositories(true)
.WithDefaultRepositoryClasses(typeof(MyTestCustomBaseRepository<,>), typeof(MyTestCustomBaseRepository<>));
.AddDefaultRepositories(true)
.SetDefaultRepositoryClasses(typeof(MyTestCustomBaseRepository<,>), typeof(MyTestCustomBaseRepository<>));
//Act
new MyTestRepositoryRegistrar(options).AddRepositories(services, typeof(MyFakeDbContext));
new MyTestRepositoryRegistrar(options).AddRepositories(services);
//Assert
@ -196,7 +196,10 @@ namespace Volo.Abp.Domain.Repositories
public class TestDbContextRegistrationOptions : CommonDbContextRegistrationOptions
{
public TestDbContextRegistrationOptions(Type originalDbContextType)
: base(originalDbContextType)
{
}
}
}
}

11
test/Volo.Abp.EntityFrameworkCore.Tests.SecondContext/Volo/Abp/EntityFrameworkCore/TestApp/SecondContext/AbpEfCoreTestSecondContextModule.cs

@ -1,4 +1,5 @@
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.EntityFrameworkCore.TestApp.ThirdDbContext;
using Volo.Abp.Modularity;
namespace Volo.Abp.EntityFrameworkCore.TestApp.SecondContext
@ -8,6 +9,16 @@ namespace Volo.Abp.EntityFrameworkCore.TestApp.SecondContext
{
public override void ConfigureServices(IServiceCollection services)
{
services.AddAbpDbContext<SecondDbContext>(options =>
{
options.AddDefaultRepositories();
});
services.AddAbpDbContext<ThirdDbContext.ThirdDbContext>(options =>
{
options.AddDefaultRepositories<IThirdDbContext>();
});
services.AddAssemblyOf<AbpEfCoreTestSecondContextModule>();
}

9
test/Volo.Abp.EntityFrameworkCore.Tests.SecondContext/Volo/Abp/EntityFrameworkCore/TestApp/ThirdDbContext/IThirdDbContext.cs

@ -0,0 +1,9 @@
using Microsoft.EntityFrameworkCore;
namespace Volo.Abp.EntityFrameworkCore.TestApp.ThirdDbContext
{
public interface IThirdDbContext : IEfCoreDbContext
{
DbSet<ThirdDbContextDummyEntity> DummyEntities { get; set; }
}
}

16
test/Volo.Abp.EntityFrameworkCore.Tests.SecondContext/Volo/Abp/EntityFrameworkCore/TestApp/ThirdDbContext/ThirdDbContext.cs

@ -0,0 +1,16 @@
using Microsoft.EntityFrameworkCore;
namespace Volo.Abp.EntityFrameworkCore.TestApp.ThirdDbContext
{
/* This dbcontext is just for testing to replace dbcontext from the application using AbpDbContextRegistrationOptions.ReplaceDbContext
*/
public class ThirdDbContext : AbpDbContext<ThirdDbContext>, IThirdDbContext
{
public DbSet<ThirdDbContextDummyEntity> DummyEntities { get; set; }
public ThirdDbContext(DbContextOptions<ThirdDbContext> options)
: base(options)
{
}
}
}

9
test/Volo.Abp.EntityFrameworkCore.Tests.SecondContext/Volo/Abp/EntityFrameworkCore/TestApp/ThirdDbContext/ThirdDbContextDummyEntity.cs

@ -0,0 +1,9 @@
using Volo.Abp.Domain.Entities;
namespace Volo.Abp.EntityFrameworkCore.TestApp.ThirdDbContext
{
public class ThirdDbContextDummyEntity : AggregateRoot
{
public string Value { get; set; }
}
}

9
test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/AbpEntityFrameworkCoreTestModule.cs

@ -3,6 +3,7 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Autofac;
using Volo.Abp.EntityFrameworkCore.TestApp.SecondContext;
using Volo.Abp.EntityFrameworkCore.TestApp.ThirdDbContext;
using Volo.Abp.Modularity;
using Volo.Abp.TestApp;
using Volo.Abp.TestApp.EntityFrameworkCore;
@ -21,12 +22,8 @@ namespace Volo.Abp.EntityFrameworkCore
services.AddAbpDbContext<TestAppDbContext>(options =>
{
options.WithDefaultRepositories();
});
services.AddAbpDbContext<SecondDbContext>(options =>
{
options.WithDefaultRepositories();
options.AddDefaultRepositories();
options.ReplaceDbContext<IThirdDbContext>();
});
var inMemorySqlite = new SqliteConnection("Data Source=:memory:");

28
test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/DbContext_Replace_Tests.cs

@ -0,0 +1,28 @@
using Microsoft.Extensions.DependencyInjection;
using Shouldly;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.EntityFrameworkCore.TestApp.ThirdDbContext;
using Volo.Abp.TestApp.EntityFrameworkCore;
using Xunit;
namespace Volo.Abp.EntityFrameworkCore
{
public class DbContext_Replace_Tests : EntityFrameworkCoreTestBase
{
private readonly IRepository<ThirdDbContextDummyEntity> _dummyRepository;
public DbContext_Replace_Tests()
{
_dummyRepository = ServiceProvider.GetRequiredService<IRepository<ThirdDbContextDummyEntity>>();
}
[Fact]
public void Should_Replace_DbContext()
{
(ServiceProvider.GetRequiredService<IThirdDbContext>() is TestAppDbContext).ShouldBeTrue();
(_dummyRepository.GetDbContext() is IThirdDbContext).ShouldBeTrue();
(_dummyRepository.GetDbContext() is TestAppDbContext).ShouldBeTrue();
}
}
}

7
test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/TestApp/EntityFrameworkCore/TestAppDbContext.cs

@ -1,13 +1,16 @@
using Microsoft.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore.TestApp.ThirdDbContext;
using Volo.Abp.TestApp.Domain;
namespace Volo.Abp.TestApp.EntityFrameworkCore
{
public class TestAppDbContext : AbpDbContext<TestAppDbContext>
public class TestAppDbContext : AbpDbContext<TestAppDbContext>, IThirdDbContext
{
public DbSet<Person> People { get; set; }
public DbSet<ThirdDbContextDummyEntity> DummyEntities { get; set; }
public TestAppDbContext(DbContextOptions<TestAppDbContext> options)
: base(options)
{

2
test/Volo.Abp.MemoryDb.Tests/Volo/Abp/MemoryDb/AbpMemoryDbTestModule.cs

@ -22,7 +22,7 @@ namespace Volo.Abp.MemoryDb
services.AddMemoryDbContext<TestAppMemoryDbContext>(options =>
{
options.WithDefaultRepositories();
options.AddDefaultRepositories();
});
services.AddAssemblyOf<AbpMemoryDbModule>();

1
test/Volo.Abp.TestApp/Volo/Abp/TestApp/TestAppModule.cs

@ -14,6 +14,7 @@ namespace Volo.Abp.TestApp
public override void ConfigureServices(IServiceCollection services)
{
ConfigureAutoMapper(services);
services.AddAssemblyOf<TestAppModule>();
}

Loading…
Cancel
Save