首页 > 其他分享 >17_两种IOC容器注入的类型

17_两种IOC容器注入的类型

时间:2024-03-04 23:23:03浏览次数:18  
标签:容器 基于 17 接口 dependency MyClass IOC public 注入

两种IOC容器注入的类型

基于接口的注入

在基于接口的注入中,您使用接口来定义依赖项。这允许您在不更改代码的情况下轻松地切换依赖项的不同实现。

代码示例:

public interface IMyDependency
{
    void DoSomething();
}
public class MyClass
{
    private readonly IMyDependency _dependency;
    public MyClass(IMyDependency dependency)
    {
        _dependency = dependency;
    }
}

在上面的示例中,IMyDependency 接口定义了依赖项。
MyClass 类使用该接口来注入依赖项。
您可以使用不同的类来实现 IMyDependency 接口,而无需更改 MyClass 类的代码。

基于类的注入

在基于类的注入中,您使用类来定义依赖项。这可以提供更好的性能,但它也使得在不更改代码的情况下切换依赖项的不同实现变得更加困难。

代码示例:

public class MyDependency
{
    public void DoSomething()
    {
        // ...
    }
}

public class MyClass
{
    private readonly MyDependency _dependency;

    public MyClass(MyDependency dependency)
    {
        _dependency = dependency;
    }
}

在上面的示例中,MyDependency 类定义了依赖项。
MyClass 类使用该类来注入依赖项。
如果您想要切换 MyDependency 类的一个不同的实现,您需要更改 MyClass 类的代码。

哪种注入方法更好?

基于接口的注入通常是首选方法,因为它更灵活且更容易测试。
但是,基于类的注入在某些情况下可以提供更好的性能。

何时使用基于类的注入?

您可能需要使用基于类的注入的情况包括:

当您需要访问依赖项的非公共成员时。
当您需要确保依赖项是单例时。
当您需要优化性能时。

完整的代码示例(基于接口和类的注入)

using System;
using Microsoft.Extensions.DependencyInjection;

// 定义依赖接口
public interface IDependency
{
    void DoWork();
}


// 实现依赖接口的类
public class DependencyImplementation : IDependency
{
    public void DoWork()
    {
        Console.WriteLine("工作已完成。");
    }
}



// 使用基于接口的注入的客户端类
public class ClientWithInterfaceInjection
{
    private readonly IDependency _dependency;

    public ClientWithInterfaceInjection(IDependency dependency)
    {
        _dependency = dependency;
    }

    public void StartWork()
    {
        Console.WriteLine("start work,基于接口注入");
        _dependency.DoWork();
        Console.WriteLine("end work,基于接口注入");
    }
}


// 使用基于类的注入的客户端类
public class ClientWithClassInjection
{
    private readonly DependencyImplementation _dependency;

    public ClientWithClassInjection(DependencyImplementation dependency)
    {
        _dependency = dependency;
    }

    public void StartWork()
    {
        System.Console.WriteLine("start work,基于类注入");
        _dependency.DoWork();
        System.Console.WriteLine("end work,基于类注入");
    }
}



class Program
{
    static void Main(string[] args)
    {
        // 设置依赖注入容器
        var services = new ServiceCollection();

        // 注册接口和实现
        services.AddTransient<IDependency, DependencyImplementation>();

        // 注册类
        services.AddTransient<DependencyImplementation>();

        services.AddTransient<ClientWithInterfaceInjection>();
        services.AddTransient<ClientWithClassInjection>();



        // 构建服务提供者
        var serviceProvider = services.BuildServiceProvider();

        // 基于接口的注入
        var clientInterface = serviceProvider.GetService<ClientWithInterfaceInjection>();
        clientInterface.StartWork();

        Console.WriteLine("----------------------");

        // 基于类的注入
        var clientClass = serviceProvider.GetService<ClientWithClassInjection>();
        clientClass.StartWork();

    }
}

标签:容器,基于,17,接口,dependency,MyClass,IOC,public,注入
From: https://www.cnblogs.com/cookie2030/p/18053003

相关文章

  • P1757 通天之分组背包
    原题链接题解对于每个容量,当前组\(i\)而言,放的决策有\(size(i)+1\)种code#include<bits/stdc++.h>usingnamespacestd;structunit{intw,v;};vector<unit>G[1005];intmain(){intm,n;cin>>m>>n;intlen=0;for(inti=1;i&......
  • P10217 [省选联考 2024] 季风 题解
    [省选联考2024]季风Description给定\(n,k,x,y\)和\(2n\)个整数\(x_0,y_0,x_1,y_1,\dots,x_{n-1},y_{n-1}\)。找到最小的非负整数\(m\),使得存在\(2m\)个实数\(x_0',y_0',x_1',y_1',\dots,x_{m-1}',y_{m-1}'\)满足以下条件,或报告不存在这样的\(m\):\(\s......
  • 37vector容器与API
    vector容器与API#include<iostream>#include<vector>usingnamespacestd;/*vector容器:向量容器底层数据结构:动态开辟的数组,每次以原来空间2倍进行扩容vector<int>vec;增加:vec.push_back(20);末尾添加元素O(1)导致容器扩容vec.insert(it,20);it迭代器指向的位......
  • 40容器适配器
    容器适配器标准容器-容器适配器适配器底层没有自己的数据结构,它是另外一个容器的封装,它的方法全部由底层依赖的容器实现。容器适配器没有实现自己的迭代器。参考stack,deque依赖deque;priority_deque依赖vector前者的原因:vector的初始内存使用效率太低,需要多次resize;......
  • 41无序关联容器与有序关联容器
    无序关联容器与有序关联容器参考迭代器普通的正向迭代器iterator反向迭代器reverse_iterator常量迭代器:const_iterator是iterator的基类,返回一个常指针vector<int>vec;vector<int>::iteratorit=vec.begin();//可以通过*it修改vec的值vector<int>::reverse_iterator......
  • docker容器命令
      docker是基于linux内核的,必须需要linux系统才能运行起来。1.创建容器实例dockerrun[options]image[command][arg...] #启动交互式容器命令dockerrun-itubuntu/bin/bash  宿主机的端口:docker中的端口。 2.查看正在运行的容器dockerps【options】......
  • docker系列教程04---容器网络
    一、Docker不启动时默认的网络情况这里先把Docker停掉了,然后咱们ifconfig看一眼:ifconfig ens33不用多说了,lo为回环。这里可能还会有一个virbr0,在CentOS7的安装过程中如果有选择相关虚拟化的的服务安装系统后,启动网卡时会发现有一个以网桥连接的私网地址的virbr0网卡(virbr......
  • 全网首套完整containerd容器工具教程
    1、Containerd的由来【Docker名噪一时,捐出runC】2013年docker公司在推出docker产品后,由于其对全球技术产生了一定的影响力,Google公司明显感觉到自己公司内部所使用的Brog系统江湖地位受到的威胁,希望Docker公司能够与自己联合打造一款开源的容器运行时作为Docker核心依赖,但Docker......
  • AtCoder Regular Contest 171
    \[\large\text{Round13:AtCoderRegularContest171}\]一言:我并不是要失去自由,而是要去收获那无可替代的不自由。——SSSS.电光机王几年没写了,但是我们仍然要捡回来!没啥好写的,T1,T2能力范围之内,T3不会,T4感觉很好,但是没做出来。\(\text{D:RollingHash}\)这题无论......
  • docker环境部署容器之间互通:Hyperf+MySQL
    在docker中要使Hyperf和Mysql网络互通,则需要在创建相应容器的时候指定共享网络,步骤如下:一、首先我们指定共享网络dockernetworkcreate--subnet172.18.0.1/16test  //整条命令复制执行就行不用改这个ip二、创建hyperf命令dockerrun--namehyperf-vD:\hyperf202......