做完以上变更之后,新建一个控制台程序,引用这个 Abp 库项目,然后键入以下代码进行测试即可。
using System; using Abp; using Abp.Modules; using Abp.Runtime.Session; namespace ConsoleApp { class Program { static void Main(string[] args) { // Abp 框架测试 using (var bootstarp = AbpBootstrapper.Create<StartupModule>()) { bootstarp.Initialize(); // 解析 IAbpSession 看是否正常地进行了注入 var session = bootstarp.IocManager.Resolve<IAbpSession>(); if (session != null && session is ClaimsAbpSession claimsSession) { Console.WriteLine("当前 Session 已经成功被注入为 ClaimAbpSession"); } } Console.ReadLine(); } } [DependsOn(typeof(AbpKernelModule))] public class StartupModule : AbpModule { } } 4.2 EFCore 库与相关库改造针对 Abp 库进行测试之后,基本上我们 Abp 现在所有组件都是通过 DryIoc 来进行注册与解析的了。不过仅仅针对 Abp 做这些更改其实是不够的,除了 Abp 核心库之外,我们最常用的就是数据库操作了。因为在 Abp.EntityFrameworkCore 库 和 Abp.EntityFramework.Common 的内部也有部分代码在之前是直接通过 IWindsorContainer 进行注册与解析操作的,所以我们也得继续改报错的地方。
4.2.1 仓储类注册在 Abp.EntityFramework.Common 库的 EfGenericRepositoryRegistrar 类型内部,有使用到 IWindsorContainer 的组件注册方法,用于注入 IRepository<,> 泛型仓储。下面代码展示的更改后的结果:
private void RegisterForDbContext( Type dbContextType, IIocManager iocManager, Type repositoryInterface, Type repositoryInterfaceWithPrimaryKey, Type repositoryImplementation, Type repositoryImplementationWithPrimaryKey) { foreach (var entityTypeInfo in _dbContextEntityFinder.GetEntityTypeInfos(dbContextType)) { var primaryKeyType = EntityHelper.GetPrimaryKeyType(entityTypeInfo.EntityType); if (primaryKeyType == typeof(int)) { var genericRepositoryType = repositoryInterface.MakeGenericType(entityTypeInfo.EntityType); if (!iocManager.IsRegistered(genericRepositoryType)) { var implType = repositoryImplementation.GetGenericArguments().Length == 1 ? repositoryImplementation.MakeGenericType(entityTypeInfo.EntityType) : repositoryImplementation.MakeGenericType(entityTypeInfo.DeclaringType, entityTypeInfo.EntityType); // iocManager.IocContainer.Register( // Component // .For(genericRepositoryType) // .ImplementedBy(implType) // .Named(Guid.NewGuid().ToString("N")) // .LifestyleTransient() // ); iocManager.IocContainer.Register(genericRepositoryType,implType,Reuse.Transient); } } var genericRepositoryTypeWithPrimaryKey = repositoryInterfaceWithPrimaryKey.MakeGenericType(entityTypeInfo.EntityType,primaryKeyType); if (!iocManager.IsRegistered(genericRepositoryTypeWithPrimaryKey)) { var implType = repositoryImplementationWithPrimaryKey.GetGenericArguments().Length == 2 ? repositoryImplementationWithPrimaryKey.MakeGenericType(entityTypeInfo.EntityType, primaryKeyType) : repositoryImplementationWithPrimaryKey.MakeGenericType(entityTypeInfo.DeclaringType, entityTypeInfo.EntityType, primaryKeyType); // iocManager.IocContainer.Register( // Component // .For(genericRepositoryTypeWithPrimaryKey) // .ImplementedBy(implType) // .Named(Guid.NewGuid().ToString("N")) // .LifestyleTransient() // ); iocManager.IocContainer.Register(genericRepositoryTypeWithPrimaryKey,implType,Reuse.Transient); } } }按照以上方法更改之后,Abp.EntityFramework.Common 应该可以正常地进行编译了。
4.2.2 DbContext 配置类更改在 AbpEfCoreConfiguration 类型当中,也有使用到 IWindsorContainer 接口的地方,进行如下变更即可:
using System; using Abp.Dependency; using Castle.MicroKernel.Registration; using DryIoc; using Microsoft.EntityFrameworkCore; namespace Abp.EntityFrameworkCore.Configuration { public class AbpEfCoreConfiguration : IAbpEfCoreConfiguration { private readonly IIocManager _iocManager; public AbpEfCoreConfiguration(IIocManager iocManager) { _iocManager = iocManager; } public void AddDbContext<TDbContext>(Action<AbpDbContextConfiguration<TDbContext>> action) where TDbContext : DbContext { // _iocManager.IocContainer.Register( // Component.For<IAbpDbContextConfigurer<TDbContext>>().Instance( // new AbpDbContextConfigurerAction<TDbContext>(action) // ).IsDefault() // ); _iocManager.IocContainer.UseInstance<IAbpDbContextConfigurer<TDbContext>>(new AbpDbContextConfigurerAction<TDbContext>(action)); } } } 4.2.3 EFCore 库模块变更