NetCore3.0实现自定义IOC容器注入
在之前的ASP.NET MVC实现依赖注入一文中,通过替换默认的ControllerFactory来达到对Controller生命周期的拦截,实现自定义的对象注入,在NetCore3.0中需要重新实现,步骤如下:
1.获取所有相关业务程序集
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public static List<Assembly> GetFrameworkAssemblys() { var list = new List<Assembly>(); var deps = DependencyContext.Default; var libs = deps.CompileLibraries; foreach ( var lib in libs) { if (!lib.Serviceable && lib.Type != "package" && lib.Name.StartsWith( "FastCloud" )) { var assembly = AssemblyLoadContext.Default.LoadFromAssemblyName( new AssemblyName(lib.Name)); list.Add(assembly); } } return list; } |
2.对所有Component组件注册
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | public class InjectContext { private static ContainerBuilder Container; public static void Init() { InjectFrameWork(); } public static void InjectFrameWork() { Container = new ContainerBuilder(); //获框架取所有程序集 List<Assembly> assemblies = CloudUtil.GetFrameworkAssemblys(); //注入框架所有Component组件 Container.RegisterAssemblyTypes(assemblies.ToArray(), typeof (Component), true ); Container.Build(CotainerEnum.BuidlModel.OverWrite); } public static object Resolve(Type Type, CotainerEnum.TypeEqual TypeEqual = CotainerEnum.TypeEqual.Ref) { return Container.Resolve(Type, TypeEqual); } public static List<Type> GetRegistType(Type @Type) { return Container.GetRegistType(@Type); } } |
3.实现自定义Controller工厂
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | public class CloudControllerActivator : IControllerActivator { public object Create(ControllerContext context) { if (context == null ) { throw new ArgumentNullException(nameof(context)); } if (context.ActionDescriptor == null ) { throw new ArgumentException(nameof(ControllerContext.ActionDescriptor)); } var controllerTypeInfo = context.ActionDescriptor.ControllerTypeInfo; if (controllerTypeInfo == null ) { throw new ArgumentException(nameof(context.ActionDescriptor.ControllerTypeInfo)); } Type controllerType = controllerTypeInfo.AsType(); return InjectContext.Resolve(controllerType); } public void Release(ControllerContext context, object controller) { if (context == null ) { throw new ArgumentNullException(nameof(context)); } if (controller == null ) { throw new ArgumentNullException(nameof(controller)); } var disposable = controller as IDisposable; if (disposable != null ) { disposable.Dispose(); } } } |
4.修改配置,使用自定义Controller工厂
1 2 3 4 5 6 7 | //替换默认Controller工厂 var defaultActivator = services.FirstOrDefault(c => c.ServiceType == typeof (IControllerActivator)); if (defaultActivator != null ) { services.Remove(defaultActivator); } services.AddSingleton<IControllerActivator, CloudControllerActivator>(); |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步