dotnet依赖注入与IOC(包含Autofac的使用)

依赖注入与IOC

IOC

IOC 是 Inversion of Control(控制反转)的缩写。在软件开发中,IOC 是一种设计模式,它改变了传统的程序设计流程,使得对象之间的依赖关系由代码本身控制变为由外部容器控制。

而采用IOC 设计模式后,对象之间的依赖关系由外部容器来管理和注入,对象本身不需要关心依赖的具体实现,只需要定义自己的接口或抽象类,并在外部容器中配置依赖关系。这样可以降低代码的耦合度,提高代码的灵活性、可维护性和可扩展性。

常见的IOC 容器包括 Spring Framework 中的 Spring IoC ,dotnet中的autofoc,它通过依赖注入(Dependency Injection)的方式来实现控制反转。通过IOC 容器,可以将对象之间的依赖关系集中管理,实现了代码的松耦合,使得程序更易于理解、扩展和维护。

依赖注入DI

1、继承接口并实现构造方法

 public class UserService : IUserService
 {
     private  IUserRepository _userService ;

     public UserService(IUserRepository userService)
     {
         _userService = userService;
     }
 }

2、在program里加上

builder.Services.AddTransient<IUserRepository, UserRepository>();
builder.Services.AddTransient<IUserService, UserService>();

.net提供了三种生命周期的容器

builder.Services.AddTransient<IOperationTransient, Operation>(); builder.Services.AddScoped<IOperationScoped, Operation>(); builder.Services.AddSingleton<IOperationSingleton, Operation>();

  • 暂时性对象始终不同。 IndexModel 和中间件中的临时 OperationId 值不同。
  • 范围内对象对给定请求而言是相同的,但在每个新请求之间不同。
  • 单一实例对象对于每个请求是相同的。

3、Controller层使用

 public class UserController : ControllerBase
 {

     private readonly IUserService _userService ;

     public UserController(IUserService userService)
     {
         _userService = userService;
     }
 }

Autofac轻量容器的使用

1、安装Nuget包Autofac.Extensions.DependencyInjectionAutofac.Extras.DynamicProxy

2、使用程序集注册,通过Model注册(这里只列这一种Auto官方文档Assembly Scanning — Autofac 7.0.0 documentation

**创建Model类 **

using Autofac;
using Blog.Core.IServices;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyModel;
using System.Reflection;
using System.Runtime.Loader;

namespace Blog.Core.Configuration.AutoModule
{
    public class ServiceModel: Autofac.Module
    {
        protected override void Load(ContainerBuilder builder)
        {
            // 自动对集成 IDependency 接口的类进行注册
            Type baseType = typeof(IUserService);
            var compilationLibrary = DependencyContext.Default.CompileLibraries.Where(x => !x.Serviceable && x.Type == "project").ToList();

            List<Assembly> assemblyList = new List<Assembly>();
            foreach (var _compilation in compilationLibrary)
            {
                try
                {
                    assemblyList.Add(AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName(_compilation.Name)));
                }
                catch (Exception ex)
                {
                    Console.WriteLine(_compilation.Name + ex.Message);
                }
            }
            builder.RegisterAssemblyTypes(assemblyList.ToArray()).Where(type => baseType.IsAssignableFrom(type) && !type.IsAbstract)
                .AsSelf()
                .AsImplementedInterfaces()
                .PropertiesAutowired()
                .InstancePerLifetimeScope();

            var controllersTypesInAssembly = typeof(Program).Assembly.GetExportedTypes()
                .Where(type => typeof(ControllerBase).IsAssignableFrom(type)).ToArray();

            builder.RegisterTypes(controllersTypesInAssembly).PropertiesAutowired();

        }
    }
}

**在program.cs中解析Model **

builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
builder.Host.ConfigureContainer<ContainerBuilder>(i => i.RegisterModule<ServiceModel>());
builder.Services.AddControllers().AddControllersAsServices();

在Controller中使用

public class UserController : ControllerBase
{

    private readonly IUserService _userService ;

    public UserController(IUserService userService)
    {
        _userService = userService;
    }
}

相关推荐

  1. dotnet依赖注入IOC(包含Autofac使用)

    2024-04-03 18:30:03       21 阅读
  2. .Net6 使用Autofac进行依赖注入

    2024-04-03 18:30:03       18 阅读
  3. .net中依赖注入框架Autofac

    2024-04-03 18:30:03       13 阅读
  4. ASP .NET Core 中 Autofac 依赖注入

    2024-04-03 18:30:03       11 阅读
  5. SpringIoC(控制反转)和 DI(依赖注入

    2024-04-03 18:30:03       19 阅读
  6. SpringBean标签配置IOC依赖注入详解

    2024-04-03 18:30:03       14 阅读
  7. Spring依赖注入

    2024-04-03 18:30:03       12 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-03 18:30:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-03 18:30:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-03 18:30:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-03 18:30:03       20 阅读

热门阅读

  1. TS小记--

    2024-04-03 18:30:03       15 阅读
  2. 什么是json?json可以存放哪几种数据类型

    2024-04-03 18:30:03       15 阅读
  3. 学习总结!

    2024-04-03 18:30:03       14 阅读
  4. Vue3中props和emits的使用总结

    2024-04-03 18:30:03       14 阅读
  5. IO和NIO的主要区别在哪里?

    2024-04-03 18:30:03       13 阅读
  6. CSS 滚动条样式修改

    2024-04-03 18:30:03       17 阅读
  7. codeforces round 936 div2(a,b,c)

    2024-04-03 18:30:03       18 阅读
  8. Python程序设计 魔法函数

    2024-04-03 18:30:03       14 阅读
  9. ACI Fabric

    2024-04-03 18:30:03       15 阅读
  10. wencoo个人的博客目录索引-更新

    2024-04-03 18:30:03       33 阅读
  11. Oracle extent、segment、datafile、tablespace及存储关系

    2024-04-03 18:30:03       15 阅读
  12. Oracle密码文件

    2024-04-03 18:30:03       12 阅读
  13. SpringMVC 中实现自定义转换

    2024-04-03 18:30:03       14 阅读