简单使用 Mvc 内置的 Ioc

目录

  • 场景一:简单类的使用
  • 场景二:包含接口类的使用
  • 场景三:涉及引用类库的使用

场景一:简单类的使用

  类 DemoService.cs:

 public class DemoService
    {
        public string Test()
        {
            return Guid.NewGuid().ToString();
        }
    }

控制器 DemoController.cs:

public class DemoController : Controller
    {
        private readonly DemoService _demoService;

        public DemoController(DemoService demoService)
        {
            _demoService = demoService;
        }

        public IActionResult Index()
        {
            return Json(_demoService.Test());
        }
    }

需要先在 Startup.cs 下的 ConfigureServices() 方法中进行注册才能使用,这里提供了三种方法,可以选择自己喜欢的方式进行注册。

 //方法一
    services.AddSingleton(typeof(DemoService), new DemoService());

    //方法二
    services.AddSingleton(typeof(DemoService));

    //方法三
    services.AddSingleton<DemoService>();

 

执行输出结果,正常:


IOC 的容器目前有三种生命周期 Transient、Scoped 和 Singleton,使用方式大致相同,具体差异不在这里进行叙述:
//范例
    services.AddTransient(typeof(DemoService));
services.AddScoped
<DemoService>();

场景二:包含接口类的使用

  接口 IDemo2Service.cs:

 public interface IDemo2Service
    {
        string Test();
    }

接口实现 Demo2Service.cs:

public class Demo2Service : IDemo2Service
    {
        public string Test()
        {
            return Guid.NewGuid().ToString();
        }
    }

控制器 Demo2Controller.cs:

 public class Demo2Controller : Controller
    {
        private readonly IDemo2Service _demoService;

        public Demo2Controller(IDemo2Service demoService)
        {
            _demoService = demoService;
        }

        public IActionResult Index()
        {
            return Json(_demoService.Test());
        }
    }

目前需要在类 Startup.cs 中的 ConfigureServices() 方法内新增的注册方法如下(可选其一):

 //方法一
    services.AddSingleton(typeof(IDemo2Service), new Demo2Service());

    //方法二
    services.AddSingleton(typeof(IDemo2Service), typeof(Demo2Service));

    //方法三
    services.AddSingleton<IDemo2Service, Demo2Service>();


输出结果正常:

场景三:涉及引用类库的使用

  我们先新增一个用于标识作用的接口 IServiceSupport.cs,该接口没有包含方法,只是一个标识作用,有点类似 DDD 的聚合根接口 IAggregateRoot: 

 public interface IServiceSupport
    {
    }

接口 IDemo3Service.cs

 public interface IDemo3Service
    {
        string Test();
    }

接口实现 Demo3Service.cs

 public class Demo3Service : IDemo3Service
    {
        public string Test()
        {
            return Guid.NewGuid().ToString();
        }
    }
这次我们统一编写一个方法将该类库下的所有接口和实现进行注册:
 private static void AddSingletonServices(IServiceCollection services)
        {
            var asm = Assembly.Load(new AssemblyName("IocCoreDemo.Services"));
            var serviceTypes = asm.GetTypes()
                .Where(x => typeof(IServiceSupport).IsAssignableFrom(x) && !x.GetTypeInfo().IsAbstract);

            foreach (var serviceType in serviceTypes)
            {
                foreach (var serviceInterface in serviceType.GetInterfaces())
                {
                    services.AddSingleton(serviceInterface, serviceType);
                }
            }
        }

因为使用了反射,所以需要 using System.Reflection;

  这次我们在 Startup.cs 类中添加和修改的方法如图所示:

Startup.cs 类中使用的有效命名空间如下:
using IocCoreDemo.Services;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System.Linq;
using System.Reflection;

如果注入失败,执行结果便会如图所示:

 

  为什么会出现上图的情况呢?因为小编忘记把接口 IDemo3Service 继承自接口 IServiceSupport 了,接下来我们只需要做出一个继承的编写操作即可:

 

  再次执行启动,结果便如你所料:


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自己动手做框架是一种非常有挑战性的任务,尤其是对于 ORM(对象关系映射)、MVC(模型-视图-控制器)和IOC(控制反转)这三个框架而言。以下是对这三个框架的简要介绍,以及它们的实现过程。 首先,ORM(对象关系映射)框架是用于将数据库中的表映射为对象的一种技术。在实现ORM框架时,需要定义对象和表之间的映射关系,并提供相应的API来进行数据库的增删改查操作。还需要处理对象之间的关联关系(如一对一、一对多等),并提供事务管理、缓存等功能。 其次,MVC(模型-视图-控制器)框架是一种用于开发Web应用程序的架构模式,将应用程序分为模型、视图和控制器三层。在实现MVC框架时,需要定义模型、视图和控制器的接口,并提供相应的实现。模型负责处理数据逻辑,视图负责展示用户界面,而控制器则负责接收用户请求并进行处理,最后将结果返回给视图进行展示。 最后,IOC(控制反转)框架是一种通过依赖注入来管理对象之间的依赖关系的技术。在实现IOC框架时,需要定义依赖注入的规则,并提供相应的实现。可以使用反射机制来自动实例化对象,并将依赖的对象注入到目标对象中。还需要提供对象的生命周期管理(如单例模式、原型模式等)和对象的配置方式(如XML配置、注解配置等)。 总结来说,自己动手实现ORM、MVCIOC框架需要掌握相关的技术和知识,并具备良好的设计和编码能力。除了理论知识外,还需要具备实际项目的经验,以便能够更好地设计和实现这些框架。同时,也需要不断学习和改进,跟上技术的发展潮流,以确保框架的高效和可靠性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值