ASP.NET 5:依赖注入

1.背景

如果某个具体的(或类)对象被客户程序所依赖,通常把它们抽象成抽象类或接口。简单说,客户程序摆脱所依赖的具体类型,称之为面向接口编程。

那么问题来了?如何选择客户程序所需要的实现类?在使用创建型模式下创建对象是不难解决这个问题。

但如果设计的不是具体业务逻辑,而是公共类库或框架程序,对外只提供抽象而已,该如何把外部使用的类型传递给它们?

我们可以采用“依赖注入”的方式,将加工好的抽象类型实体“注入”到客户程序中。

注:依赖注入DI(Dependency Injection),它和控制反转IOC(Inversion of Control)是同一个意思,不同术语叫法。

2.场景

客户程序获取年份,我们先设计一个接口:

using System;

namespace Blog.Consoles
{
public interface ITimeProvider
{
DateTime CurrentDate { get; }
}
}

并对这个接口实现(可以多种实现哦,这也是设计接口的原因):

using System;

namespace Blog.Consoles
{
public class TimeProvider : ITimeProvider
{
public DateTime CurrentDate
{
get { return DateTime.Now; }
}
}
}

那么我们在客户程序使用:

using System;

namespace Blog.Consoles
{
class Program
{
static void Main(string[] args)
{
ITimeProvider tp = new TimeProvider();
Console.WriteLine(tp.CurrentDate.Year); Console.ReadKey();
}
}
}

这样实现的依赖关系是:

显然这样客户程序还需要知道具体类型TimeProvider,我们增加一个对象:

using System;
using System.Collections.Generic; namespace Blog.Consoles
{
public class Assembler
{
//保存抽象类型和实体类型
static Dictionary<Type, Type> d = new Dictionary<Type, Type>(); static Assembler()
{
//注册抽象类型需要使用的实体类型
d.Add(typeof(ITimeProvider), typeof(TimeProvider));
} public object Create(Type type)
{
if ((type == null) || !d.ContainsKey(type))
{
throw new NullReferenceException();
} return Activator.CreateInstance(d[type]);
} public T Create<T>()
{
return (T)Create(typeof(T));
}
}
}

此时再改造依赖关系:

这样客户程序只依赖Assembler和ITimeProvider,并不知道TimeProvider存在。

接下来如何写注入代码?下面分几种方式。

3.构造注入

构造注入使用构造方法,通过Assembler或其它机制把抽象类型作为参数传递。其实现代码:

using System;

namespace Blog.Consoles
{
class Program
{
public ITimeProvider _tp;
public Program(ITimeProvider tp)
{
_tp = tp;
} public int GetYear()
{
return _tp.CurrentDate.Year;
} static void Main(string[] args)
{
ITimeProvider time = new Assembler().Create<ITimeProvider>();
Program p = new Program(time);
Console.WriteLine(p.GetYear()); Console.ReadKey();
}
}
}

4.设置注入

通过属性方法赋值实现的,相对于构造方法一次性注入的方式,设置注入可以在需要时有更改的机会。实现代码:

using System;

namespace Blog.Consoles
{
class Program
{
public ITimeProvider _tp { get; set; } public int GetYear()
{
return _tp.CurrentDate.Year;
} static void Main(string[] args)
{
ITimeProvider time = new Assembler().Create<ITimeProvider>(); Program p = new Program();
p._tp = time; Console.WriteLine(p.GetYear()); Console.ReadKey();
}
}
}

还可以简写:

using System;

namespace Blog.Consoles
{
class Program
{
public ITimeProvider _tp { get; set; } public int GetYear()
{
return _tp.CurrentDate.Year;
} static void Main(string[] args)
{
var p = new Program() { _tp = new Assembler().Create<ITimeProvider>() }; Console.WriteLine(p.GetYear()); Console.ReadKey();
}
}
}

5.MEF注入

导出部件:

下面不使用Assembler对象,实现代码:

using System;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.Reflection; namespace Blog.Consoles
{
class Program
{
private static CompositionContainer container; private void Compose()
{
var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
container = new CompositionContainer(catalog);
//将部件和宿主程序添加到组合容器
container.ComposeParts(this, new TimeProvider());
} //导入部件
[Import]
public ITimeProvider _tp { get; set; } public int GetYear()
{
return _tp.CurrentDate.Year;
} static void Main(string[] args)
{
var p = new Program();
p.Compose(); Console.WriteLine(p.GetYear()); Console.ReadKey();
}
}
}

 6.ASP.NET 5注入

修改Startup.cs:

测试:

7.小结

关于依赖注入的方式,还有接口注入,自定义特性等(它们之间区别和选择,自行体会或查资料),不常用就不说了。

感受到ASP.NET 5自带DI爽就行啦!(ASP.NET 5真的海皮啦!)

后面的帖子,进入项目实战了,最近比较忙,请园友保持耐心。

 
分类: DotNet 2015

ASP.NET 5:依赖注入的更多相关文章

  1. # ASP.NET Core依赖注入解读&使用Autofac替代实现

    标签: 依赖注入 Autofac ASPNETCore ASP.NET Core依赖注入解读&使用Autofac替代实现 1. 前言 2. ASP.NET Core 中的DI方式 3. Aut ...

  2. 实现BUG自动检测 - ASP.NET Core依赖注入

    我个人比较懒,能自动做的事绝不手动做,最近在用ASP.NET Core写一个项目,过程中会积累一些方便的工具类或框架,分享出来欢迎大家点评. 如果以后有时间的话,我打算写一个系列的[实现BUG自动检测 ...

  3. [译]ASP.NET Core依赖注入深入讨论

    原文链接:ASP.NET Core Dependency Injection Deep Dive - Joonas W's blog 这篇文章我们来深入探讨ASP.NET Core.MVC Core中 ...

  4. asp.net core 依赖注入几种常见情况

    先读一篇注入入门 全面理解 ASP.NET Core 依赖注入, 学习一下基本使用 然后学习一招, 不使用接口规范, 直接写功能类, 一般情况下可以用来做单例. 参考https://www.cnblo ...

  5. ASP.NET Core依赖注入——依赖注入最佳实践

    在这篇文章中,我们将深入研究.NET Core和ASP.NET Core MVC中的依赖注入,将介绍几乎所有可能的选项,依赖注入是ASP.Net Core的核心,我将分享在ASP.Net Core应用 ...

  6. 自动化CodeReview - ASP.NET Core依赖注入

    自动化CodeReview系列目录 自动化CodeReview - ASP.NET Core依赖注入 自动化CodeReview - ASP.NET Core请求参数验证 我个人比较懒,能自动做的事绝 ...

  7. ASP.NET Core 依赖注入最佳实践——提示与技巧

    在这篇文章,我将分享一些在ASP.NET Core程序中使用依赖注入的个人经验和建议.这些原则背后的动机如下: 高效地设计服务和它们的依赖. 预防多线程问题. 预防内存泄漏. 预防潜在的BUG. 这篇 ...

  8. ASP.NET Core依赖注入最佳实践,提示&技巧

    分享翻译一篇Abp框架作者(Halil İbrahim Kalkan)关于ASP.NET Core依赖注入的博文. 在本文中,我将分享我在ASP.NET Core应用程序中使用依赖注入的经验和建议. ...

  9. ASP.NET Core依赖注入解读&使用Autofac替代实现【转载】

    ASP.NET Core依赖注入解读&使用Autofac替代实现 1. 前言 2. ASP.NET Core 中的DI方式 3. Autofac实现和自定义实现扩展方法 3.1 安装Autof ...

  10. ASP.NET Core 依赖注入基本用法

    ASP.NET Core 依赖注入 ASP.NET Core从框架层对依赖注入提供支持.也就是说,如果你不了解依赖注入,将很难适应 ASP.NET Core的开发模式.本文将介绍依赖注入的基本概念,并 ...

随机推荐

  1. Effective C++:规定27:尽量少做动作的过渡

    (一个)C风格遗留转换: (T)expression T(expression) (二)C++提供四种新式转型: (1)const_cast<T>(expression):去除表达式的常量 ...

  2. 【从零学习openCV】IOS7根据人脸检测

    前言: 人脸检測与识别一直是计算机视觉领域一大热门研究方向,并且也从安全监控等工业级的应用扩展到了手机移动端的app.总之随着人脸识别技术获得突破,其应用前景和市场价值都是不可估量的,眼下在学习ope ...

  3. Atitit。团队建设--管理最佳实践--如何留住关键人才,防止人才外流 ??

    Atitit.团队建设--管理最佳实践--怎样留住核心人才,防止人才流失 ?? 1. 1.人才流失后果 1 1. 1.员工的离职带走商业技术秘密和客户等资源 1 2. 2.影响在职员工的情绪.极大挫伤 ...

  4. Oracle中关于处理小数点位数的几个函数,取小数位数,Oracle查询函数

    Oracle中关于处理小数点位数的几个函数,取小数位数,Oracle查询函数 关于处理小数点位数的几个oracle函数()1. 取四舍五入的几位小数select round(1.2345, 3) fr ...

  5. [linux]scp指令(转)

    Linux scp命令用于Linux之间复制文件和目录,具体如何使用这里好好介绍一下,从本地复制到远程.从远程复制到本地是两种使用方式.这里有具体举例: ================== Linu ...

  6. (二)给IE6-IE9中的input添加HTML5新属性-placeholder

    同样是最近遇到的一个小问题.因为IE9以下input是不支持placeholder属性的.在网上找到了解决方案,果断带走.正如鲁迅先生所说的‘拿来主义’:运用脑髓,放出眼光,自己来拿!感谢.借花献佛在 ...

  7. BCP导出导入

    BCP导出导入大容量数据实践   前言 SQL SERVER提供多种不同的数据导出导入的工具,也可以编写SQL脚本,使用存储过程,生成所需的数据文件,甚至可以生成包含SQL语句和数据的脚本文件.各有优 ...

  8. Android学习路线(十一)管理Activity的生命周期

    当一个用户进入.退出,再次进入你的应用时,你的应用中的Activity 会在它的生命周期的各个状态下切换. 比如,当你的activity第一次启动.它出如今系统的前方接受用户的焦点.在这个过程中,An ...

  9. MTK6572横屏的调试过程

    电视剧集:系统MTK缺省的系统源代码,Phone模式.底部有三个虚拟按键.需求为,设置成默认横屏,设定一个合理的虚拟按键方案. ------------------------------------ ...

  10. 使用批处理文件命令行方式快速启动和停止IIS、SqlServer

    原文:使用批处理文件命令行方式快速启动和停止IIS.SqlServer 虽然现在内存便宜了,但是自己还是嫌自己的512M内存太小,没办法,后台运行的东西太多了,有很多都是有用的没法关闭的.IIS和SQ ...