菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
229
0

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

原创
05/13 14:22
阅读数 47701

在之前的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>();

发表评论

0/200
229 点赞
0 评论
收藏