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>();
            //設置redis連接

 

發佈了35 篇原創文章 · 獲贊 61 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章