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连接

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
NetCore 是一个开源的跨平台开发框架,提供了动态注入 DLL 的功能。在 NetCore 中,可以使用依赖注入容器实现动态注入 DLL。 首先,我们需要在项目中添加所需的 DLL 文件。在项目的依赖项中,通过 NuGet 包管理器安装相关的依赖项,并将 DLL 文件复制到项目的适当路径下。 接下来,我们需要在项目的 Startup.cs 文件中配置依赖注入容器。首先,我们需要在 ConfigureServices 方法中添加相关的服务配置代码,例如: ```csharp public void ConfigureServices(IServiceCollection services) { // 添加所需的服务配置 services.AddSomeService(); // 添加某个服务 services.AddScoped<ISomeInterface, SomeImplementation>(); // 注册接口和实现的对应关系 // ... } ``` 在这里,可以根据项目的需求添加所需的服务配置,包括各种接口和实现的对应关系等。 然后,在项目的 Controller 或其他需要注入 DLL 的类中,我们可以通过构造函数或属性注入的方式来获取所需的服务,例如: ```csharp public class HomeController : Controller { private readonly ISomeInterface _someService; public HomeController(ISomeInterface someService) { _someService = someService; } // ... } ``` 通过以上方式,我们就可以在需要的地方动态注入 DLL,并使用相应的服务。当程序运行时,依赖注入容器会自动解析依赖关系,将实现注入到所需的位置。 总的来说,NetCore 提供了依赖注入的特性,通过配置依赖注入容器,可以方便地实现动态注入 DLL,并在项目中使用相应的服务。这样可以提高代码的可维护性和可测试性,使程序更加灵活和可扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值