.NET6.0实现IOC容器

这篇具有很好参考价值的文章主要介绍了.NET6.0实现IOC容器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

.NET6.0实现IOC容器

IOC的作用这里省略…只对如何使用进行说明。

1. 创建一个.NET6应用程序

这里使用 .NET6.0 WebAPI 应用

2. 声明接口

  public interface IAuthService
  {
        bool CheckToken();
  }

3. 实现接口

class AuthServiceImpl : IAuthService
{
        public bool CheckToken()
        {
            Console.WriteLine("check token");
            return true;
        }
}

4. 配置IOC容器

下面是在 program 类中的代码

var services = new ServiceCollection();
services.AddSingleton<IAuthService, AuthServiceImpl>();

5. 获取服务

通过在 Controller的构造函数中注入IAuthService

		private readonly IAuthService _service;  
		public WeatherForecastController(IAuthService service)
        {
            _service = service;
        }

        [HttpGet(Name = "test")]
        public bool Get()
        {
           return _service.CheckToken();
        }

启动后,通过swagger发起请求,验证接口。

基本IOC容器流程已实现。但是这样存在一个弊端,每个接口和实现都要在program中手动注册一遍,还要在Controller构造函数中进行依赖注入,有没有能自动实现注册代替program中的手动注册?

接下来,对上述流程进行改良。

6. 改良思路

定义一个AutowiredAttribute标记,通过Atrribute标记的方式,在实现类上标记其要实现的接口服务,然后实现一个服务加载类ServiceLoader,在这个类中反射获取所有具备AutoIocAttribute的实现类,然后注册到ServiceCollection中。

6.1 定义特性标记AutowiredAttribute

    [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
    public class AutowiredAttribute : Attribute
    {
        /// <summary>
        /// 接口
        /// </summary>
        public Type Iface { get; set; }
        /// <summary>
        /// 实现类名
        /// </summary>
        public string ImplClassName { get; set; }

        public AutowiredAttribute(Type iface, [CallerMemberName] string implClassName = "")
        {
            Iface = iface;
            ImplClassName = implClassName;
        }
    }

6.2 实现服务加载类

利用IServiceCollection作为服务容器

    public class ServiceLoader
    {
        private static object _lock = new object();
        private static AppRuntime _inst;
        private readonly IServiceCollection _iocService = new ServiceCollection();
        private readonly ICollection<Assembly> _iocAssembly = new HashSet<Assembly>();
        private IServiceProvider _iocServiceProvider = null;


        public static ServiceLoader Instance
        {
            get
            {
                if (_inst == null)
                {
                    lock (_lock)
                    {
                        _inst = new ServiceLoader();
                        _inst.Startup(typeof(ServiceLoader).Assembly);
                    }
                }
                return _inst;
            }
        }

        public T GetService<T>()
        {
            EnsureAutoIoc<T>();
            return _iocServiceProvider.GetService<T>();
        }

        private void EnsureAutoIoc<T>()
        {
            Startup(typeof(T).Assembly);
        }

        public void Startup(Assembly ass)
        {
            if (_iocAssembly.Any(x => x == ass))
            {
                return;
            }
            _iocAssembly.Add(ass);

            var types = ass.GetTypes().Where(x => x.GetCustomAttribute<AutowiredAttribute>() != null);
            foreach (var item in types)
            {
                var autoIocAtt = item.GetCustomAttribute<AutowiredAttribute>();
                AddTransient(autoIocAtt.Iface, item);
            }
            //_iocServiceProvider = _iocService.BuildServiceProvider();
            Interlocked.Exchange(ref _iocServiceProvider, _iocService.BuildServiceProvider());
        }

        private void AddTransient(Type iface, Type impl)
        {
            _iocService.AddTransient(iface, impl);
        }
    }

6.3 在实现类加上标记

    [Autowired(typeof(IAuthService))]
    class AuthServiceImpl : IAuthService
    {
    
        public bool CheckToken()
        {
            Console.WriteLine("check token");
            return true;
        }
    }

6.4 在 Controller 中调用

   var svc = ServiceLoader.Instance.GetService<IAuthService>();
   svc.CheckToken();

至此一个基本的完整IOC容器已实现。文章来源地址https://www.toymoban.com/news/detail-695049.html

到了这里,关于.NET6.0实现IOC容器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • .net core IOC容器实现(一) -- ServiceDescriptor

    IOC 容器内保存的程序运行过程中使用的服务实例。那么如果有些服务实例需要在运行时动态生成,比如,数据库连接,不可能在程序运行过程中所有线程共用一条数据库连接。所以 IOC 容器内保存的 不是具体的服务实例,而是服务的相关信息 ,使用这个信息可以在程序运行

    2024年02月07日
    浏览(12)
  • ASP.NET Core IOC容器

    ASP.NET Core IOC容器

      ServiceCollection 抽象和具体之间多种注册方式

    2024年02月09日
    浏览(15)
  • 深入了解.net core的内置IOC容器 core

     嘿嘿! 如何理解IOC呢?我们可以通过一个现实世界的模型来进行解释。比如有 一本菜谱 这个 菜谱就是我们的IServiceCollection ,里面记录了 菜(Service) 的 描述信息(ServiceDescriptor)菜名(ServiceDescriptor.ServiceType) 以及菜 具体制作方法 (ServiceDescriptor.ImplementationType),通过

    2024年02月12日
    浏览(15)
  • .NET开源IOC内置容器,生命周期管理与Autofac扩展

    .NET开源IOC内置容器,生命周期管理与Autofac扩展

    大家好,我是行不更名,坐不改姓的宋晓刚,下面将带领大家从基础小白到高阶的.NET的IOC容器依赖与注入,以及IOC内置容器和生命周期,Autofac的学习,跟上我的步伐进入C#的世界。 微信:15319589104 QQ: 2981345658 文章内容: .NET依赖注入容器的生命周期管理,瞬时生命周期(

    2024年01月21日
    浏览(9)
  • .net下优秀的IOC容器框架Autofac的使用方法,实例解析

    .net下优秀的IOC容器框架Autofac的使用方法,实例解析

    Autofac是一个功能强大的依赖注入容器,它提供了一种简单和灵活的方式来管理对象之间的依赖关系。下面是Autofac的一些优点: 简单易用:Autofac提供了一种直观和简洁的方式来注册和解析依赖项。它的API设计得非常易于理解和使用,使得开发人员可以轻松地配置和管理依赖关

    2024年02月05日
    浏览(7)
  • .Net6使用SignalR实现前后端实时通信

    .Net6使用SignalR实现前后端实时通信

    后端代码 (Asp.net core web api,用的.net6) Program.cs 代码运行逻辑: ​1. 通过 WebApplication.CreateBuilder(args) 创建一个 ASP.NET Core 应用程序建造器。 2. 使用 builder.Services.AddControllers() 添加 MVC 控制器服务和 builder.Services.AddSignalR() 添加 SignalR 服务。 3. 注册 Swagger 和 Cors 跨域设置的服务

    2024年02月01日
    浏览(11)
  • .Net6 WebApi + JWTBearer身份认证的简单实现

    VS2022 .Net6 WebApi using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.IdentityModel.Tokens; 在 appsettings.json 文件添加 TokenParameter.cs AppSettings.cs Program.cs ITokenService.cs 接口类 TokenService.cs 实现类 TokenController.cs 中Login()获取token的值 WeatherForecastController.cs 中的方法加上[Authorize]特性

    2024年02月15日
    浏览(9)
  • spring6-实现简易版IOC容器

    我们都知道,Spring框架的IOC是基于Java反射机制实现的,下面我们先回顾一下java反射。 1、回顾Java反射 Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调

    2024年02月08日
    浏览(12)
  • .NET6 项目使用RabbitMQ实现基于事件总线EventBus通信

    .NET6 项目使用RabbitMQ实现基于事件总线EventBus通信

    一、概念及介绍         通常通过使用事件总线实现来执行此发布/订阅系统。 事件总线可以设计为包含 API 的接口,该 API 是订阅和取消订阅事件和发布事件所需的。 它还可以包含一个或多个基于跨进程或消息通信的实现,例如支持异步通信和发布/订阅模型的消息队列或

    2024年04月28日
    浏览(13)
  • 造个轮子-任务调度执行小框架-IOC容器实现

    造个轮子-任务调度执行小框架-IOC容器实现

    忙里偷闲,今天终于是把概率论这块骨头干下来了。所以的话,留了点时间,把整个项目的结构和基本的功能给实现以下。通过昨天的一个功能的一个设计,我想应该可以明白我想干啥吧。这里的话,重复一下,那就是俺们要搞一个任务执行框架。 这个框架到底有啥用?举个

    2024年02月13日
    浏览(13)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包