IOC控制反转--.net framework

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

IOC控制反转–.net framework

分层架构:

一、传统依赖倒置实现

  1. 传统工艺:会有依赖,上端全部展示细节
BaseBll baseBll = new BaseBll();
baseBll.DoSomething();
  1. 依赖于抽象:左边依赖倒置,面向抽象

实现类继承接口,实现类实现接口的方法

左边抽象,右边实现类

BaseBll.cs (ZhaoxiFramework.BLL)

public class BaseBll: IBaseBll
{
    public void DoSomething()
    {
        Console.WriteLine("{0} Do Something", this.GetType().Name);
    }
}

调用

IBaseBll baseBll = new BaseBll();
baseBll.DoSomething(); 
  1. 第三方工厂

IPhone.cs(ZhaoxiFramework.Interface)

public interface IPhone
{
    void Call();
    IMicrophone iMicrophone { get; set; }
    IHeadphone iHeadphone { get; set; }
    IPower iPower { get; set; }
}

ObjectFactory.cs(ZhaoxiFramework.IOC.Project)

public static IPhone CreatePhone(IBaseBll iBLL)
{
    string classModule = ConfigurationManager.AppSettings["iPhoneType"];
    Assembly assemly = Assembly.Load(classModule.Split(',')[1]);
    Type type = assemly.GetType(classModule.Split(',')[0]);
    return (IPhone)Activator.CreateInstance(type, new object[] { iBLL });
}

AndroidPhone.cs(ZhaoxiFramework.Service)

public class AndroidPhone : IPhone
{
    public IMicrophone iMicrophone { get; set; }
    public IHeadphone iHeadphone { get; set; }
    public IPower iPower { get; set; }
    
    public AndroidPhone(IBaseBll baseBll)
    {
        Console.WriteLine("{0}构造函数", this.GetType().Name);
    }
}

App.config 文件(ZhaoxiFramework.IOC.Project)

<appSettings>
    <add key="iPhoneType" value="ZhaoxiFramework.Service.AndroidPhone,ZhaoxiFramework.Service" />
</appSettings>

调用(ZhaoxiFramework.IOC.Project)

IBaseBll baseBll = new BaseBll();
IPhone phone = ObjectFactory.CreatePhone(baseBll);

 => 那什么是IOC?

传统工艺是使用new关键词进行对象的创建,依赖于细节;

但是IOC是把对象交个一个第三方的容器来创建,其实本质就是一个工厂 + 配置文件;

上述所讲解到的 第三种方式:第三方工厂,通过工厂来创建对象的时候,如果有参数的情况下,需要把参数的实例事先创建好 new BaseBll(),然后再传递过来 ObjectFactory.CreatePhone(baseBll)

**问题:**那么在创建对象的时候,如果依赖的太多呢?难道每一个以来我们都写一个工厂来创建吗?(以下---> 代表依赖关系,前面一项依赖于后一项)

比如,ApplePhone类 —> Headphone —> Microphone —> Power …

期望: 如果说,对象A —> 对象B —> 对象C;在创建对象A的时候,能够自动的把依赖的对象创建好,传递过来,直接得到想要的对象,那岂不是很舒服。那什么方式能帮助完成这种理想情况呢?

答案: DI(依赖注入),经常和IOC放在一起使用;因为在使用IOC容器的时候,会很容易踩到坑(出现上述所说的多个依赖的关系),DI 这时候就能帮助弥补它。

=> IOC 和 DI 是什么关系?

IOC是一种对象的创建的实现(目标),而DI 是IOC 的一种实现方式

二、Unity 使用

第一步:Nuget 引入三个包,UnityUnity.AbstractionsUnity.Container

第二步:注册抽象和实现

2.1 通过IOC创建实例

有三种关系可以进行实现:1. 接口–实现类、2. 抽象类–子类、3. 普通类–子类

接口–实现类

//创建一个容器
IUnityContainer container = new UnityContainer();
//告诉容器---抽象和细节的关系 
container.RegisterType<IBaseBll, BaseBll>();
//获取对象的实例 
IBaseBll baseBll = container.Resolve<IBaseBll>();	//ZhaoxiFramework.BLL.BaseBll

抽象类–子类

ApplePad.cs(ZhaoxiFramework.Service)

public class ApplePad : AbstractPad
{
    public override void Show()
    {
        Console.WriteLine($"This is {nameof(ApplePad)}");
    }
}

AbstractPad.cs(ZhaoxiFramework.Interface)

public abstract class AbstractPad
{
    public abstract void Show();
}

创建实例:

//创建一个容器
IUnityContainer container = new UnityContainer();
//告诉容器---抽象和细节的关系 
container.RegisterType<AbstractPad, ApplePad>();
//获取对象的实例 
AbstractPad abstractPad = container.Resolve<AbstractPad>();	//输出结果为:ZhaoxiFramework.Service.ApplePad

普通类–子类

IUnityContainer container = new UnityContainer();
container.RegisterType<ApplePad, ApplePadChild>();
AbstractPad applePadChild = container.Resolve<ApplePad>();	//输出结果为:ZhaoxiFramework.Service.ApplePadChild

2.2 有趣的继承关系

ApplePadChild.cs(ZhaoxiFramework.Service)

public class ApplePadChild : ApplePad
{
    public override void Show()
    {
        base.Show();
        Console.WriteLine($"This is {nameof(ApplePadChild)}");
    }
}

创建实例1:

//创建一个容器
IUnityContainer container = new UnityContainer();
container.RegisterType<AbstractPad, ApplePad>();
AbstractPad abstractPad = container.Resolve<AbstractPad>();	//1.输出结果为:ZhaoxiFramework.Service.ApplePad

container.RegisterType<ApplePad, ApplePadChild>();
AbstractPad applePadChild = container.Resolve<ApplePad>();	//2.输出结果为:ZhaoxiFramework.Service.ApplePadChild
AbstractPad applePadChild1 = container.Resolve<AbstractPad>();	//3.输出结果为:ZhaoxiFramework.Service.ApplePadChild

注册完成之后,形成的链式如下:

AbstractPad -> ApplePad -> ApplePadChild文章来源地址https://www.toymoban.com/news/detail-599733.html

1.输出结果为 ApplePad,是因为 ApplePad -> ApplePadChild 的关系还未注册进行就开始被调用来创建实例了

1.输出结果为 ApplePadChild,是因为 链式关系已经完整了,就返回的最底层的(最后的)类型

创建实例2:

//创建一个容器
IUnityContainer container = new UnityContainer();
container.RegisterType<ApplePad, ApplePadChild>();
AbstractPad applePadChild = container.Resolve<ApplePad>();	//输出结果为:ZhaoxiFramework.Service.ApplePadChild

container.RegisterType<AbstractPad, ApplePad>();
AbstractPad abstractPad = container.Resolve<AbstractPad>();	//输出结果为:ZhaoxiFramework.Service.ApplePadChild

因为 ApplePad, ApplePadChild 已经先注册了,所以在注册 AbstractPad, ApplePad 之后再实例化的时候,期间就会有下面一个链式指向的过程:

AbstractPad -> ApplePad -> ApplePadChild

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

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

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

相关文章

  • 探索ASP.NET Framework WebAPI的简介与应用

    1.1-什么是WebAPI? WebAPI是一种用开发系统接口、设备接口API的技术,基于Http协议,请求和返回格式默认是Json格式。比WCF简单、更通用;比WebService更节省流量,更简洁。 1.2-WebAPI的特点? Action方法直接返回对象,专注于数据 更符合Restful的风格 有利于独立于IIS部署 Action可以直

    2024年02月14日
    浏览(49)
  • Asp .Net Web应用程序(.Net Framework4.8)网站发布到IIS

    开启IIS 如果已开启跳过这步 打开控制面板-程序  打开IIS 发布Web程序(.Net Framework 4.8 web网页) 进入IIS管理器新建一个应用池 新建一个网站 网站创建完毕 为文件夹添加访问权限  如果不添加访问权限,运行时将会得到如下错误 设置权限   勾选上面添加的账户的修改权限 

    2024年01月21日
    浏览(86)
  • ASP.NET中使用Entity Framework(EF)关联表查询

    在ASP.NET中使用Entity Framework(EF)进行关联表查询的具体步骤如下: 配置数据库上下文(DbContext):在 DbContext 派生类中,使用 DbSetT 属性表示每个实体对应的数据库表。确保每个实体类和关系都正确映射到数据库表。 定义关联表之间的导航属性:在实体类中,使用导航属性表

    2024年02月14日
    浏览(51)
  • .NET使用依赖注入,控制反转

    .NET 支持依赖项注入 (DI) 软件设计模式,这是一种在类及其依赖项之间实现 控制 (IoC) 的反转 的技术 避免有状态的、静态类和成员。 通过将应用设计为改用单一实例服务,避免创建全局状态。 避免在服务中直接实例化依赖类。 直接实例化会将代码耦合到特定实现。 不在服务

    2023年04月16日
    浏览(45)
  • 如何在ASP.NET Core应用中实现与第三方IoC/DI框架的整合?

    我们知道整个ASP.NET Core建立在以ServiceCollection/ServiceProvider为核心的DI框架上,它甚至提供了扩展点使我们可以与第三方DI框架进行整合。对此比较了解的读者朋友应该很清楚,针对第三方DI框架的整合可以通过在定义Startup类型的ConfigureServices方法返回一个ServiceProvider来实现。但

    2024年02月09日
    浏览(50)
  • 【Visual Studio 2022创建ASP.NET Web应用程序(.NET Framework)发布并部署到局域网 及“常见权限问题和不列出目录问题解决”】

    然后给项目命名并选择文件保存位置 用一个空项目进行举例 创建完成如下 点击更多模板选择Web窗体 创建成功如下 .aspx页面编写前端代码,.aspx.cs页面编写后端代码 通过插入表格和拉取控件快速完成 然后给Button按钮设置一个点击事件,双击按钮后会跳到.aspx.cs页面,完善下面

    2024年02月07日
    浏览(78)
  • asp.net core6 webapi 使用反射批量注入接口层和实现接口层的接口的类到ioc中

    IBLL接口层类库 BLL实现接口层类库 program中利用反射批量注入 在控制器中使用构造函数传参就可以调用已经注册的所有是是实现接口的类了的实列了

    2024年02月13日
    浏览(40)
  • ASP.NET Core MVC -- 控制器

    默认控制器访问index 特定访问路径   特定路径访问,带参数

    2024年02月12日
    浏览(52)
  • Godot.NET C#IOC重构(4-7):丝滑运动控制,角色状态机,滑墙,蹬墙跳

    目录 相关链接 前言 4:加速和减速 move_toward,加速移动 5:角色状态机 有限状态机 代码改动 改动前 改动后 如何写状态机 状态初始量 状态进入和退出 强制状态修改 熟练使用异步 6:滑墙 图片拼接 碰撞框对应 判断是否在墙上 7:蹬墙跳 优化跳跃手感 总结 十分钟制作横版动作

    2024年04月16日
    浏览(103)
  • 解决当前标识(IIS APPPOOL\XXXX)没有对“C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files”...

    在Windows Server2019数据中心版中搭建IIS项目,访问的时候出现如下所示的错误: 以管理员身份运行PowerShell; 然后运行如下命令(注意命令中的 IIS APPPOOLXXXX 为上述错误中括号中的内容): 到此重新访问部署的IIS项目地址即可成功。 如果重新访问出现如下所示的错误: 请定位到

    2024年02月11日
    浏览(47)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包