• NetCore3.0实现自定义IOC容器注入


    在之前的ASP.NET MVC实现依赖注入一文中,通过替换默认的ControllerFactory来达到对Controller生命周期的拦截,实现自定义的对象注入,在NetCore3.0中需要重新实现,步骤如下:

    1.获取所有相关业务程序集

      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组件注册

    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工厂

    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工厂

                //替换默认Controller工厂
                var defaultActivator = services.FirstOrDefault(c => c.ServiceType == typeof(IControllerActivator));
                if (defaultActivator != null)
                {
                    services.Remove(defaultActivator);
                }
                services.AddSingleton<IControllerActivator, CloudControllerActivator>();
  • 相关阅读:
    推荐:俞敏洪的一分钟励志演讲
    信息系统开发平台OpenExpressApp - 内置支持的列表编辑方式
    WPF - 资源收集
    开源 - 开源协议
    信息系统开发平台OpenExpressApp - 总体架构的由来
    WPF - DataGrid 相关收集
    报表引擎 -架构描述
    推荐:图标编辑器
    Scrum之 回顾会议
    从买房来看软件有哪几个主要关注点
  • 原文地址:https://www.cnblogs.com/yanpeng19940119/p/12263532.html
Copyright © 2020-2023  润新知