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. Java多线程&lt;1&gt;

    1.Java多线程的概念: 线(Thread):它指的是一个任务的从开始执行流程到结束. 穿线提供执行任务的机构.供java条款.在一个程序可以启动多个并发线程.候执行. 在单处理器系统中,多个线程共 ...

  2. C#枚举数和迭代器

    大道至简,始终认为简洁是一门优秀的编程语言的一个必要条件.相对来说,C#是比较简洁的,也越来越简洁.在C#中,一个关键字或者语法糖在编译器层面为我们做了很多乏味的工作,可能实现的是一个设计模式,甚至是 ...

  3. WEB功能测试说明

    站点功能測试就是对产品的各功能进行验证.依据功能測试用例,逐项測试.检查产品是否达到用户 要求的功能.经常使用的測试方法例如以下: 1.页面链接检查: 每个链接是否都有相应的页面.而且页面之间切换工具 ...

  4. Mybatis分页插件更新

    分页插件演示:http://blog.csdn.net/isea533/article/details/23831273 分页插件演示样例:http://blog.csdn.net/isea533/a ...

  5. HTTP请求中POST与GET的差别

    一.原理差别 一般我们在浏览器输入一个网址訪问站点都是GET请求;再FORM表单中,能够通过设置Method指定提交方式为GET或者POST提交方式,默觉得GET提交方式. HTTP定义了与serve ...

  6. ext3文件系统反删除利器ext3grep应用实战

    推荐:10年技术力作:<高性能Linuxserver构建实战Ⅱ>全网发行,附试读章节和全书实例源代码下载! 一."rm –rf"带来的困惑 国外一份非常著名的Linux ...

  7. 理解git经常使用命令原理

    git不同于类似SVN这样的版本号管理系统,尽管熟悉经常使用的操作就能够满足大部分需求,但为了在遇到麻烦时不至于靠蛮力去尝试,了解git的原理还是非常有必要. 文件 通过git管理的文件版本号信息所有 ...

  8. 揭秘上海传智播客平均工资超过7k 其中一位知情人士

    大学毕业生人数破700万大关.如何破解"毕业即失业"中国式的大学困境? 2014年全国高校毕业生总数将达到727万人,比被称为"史上最难就业年"的2013年再添 ...

  9. ios学习网络------4 UIWebView以三种方式中的本地数据

    UIWebView这是IOS内置的浏览器.能够浏览网页,打开文档  html/htm  pdf   docx  txt等待格文档类型. safari浏览器是通过UIWebView制作. server将 ...

  10. C++的感想

    C++的感想 大学期间,学了一学期的C语言,当然包括学习数据结构时,用的也是C语言.当时刚刚接触计算机,对于编程更是一无所知.上课学习学习,偶尔会照着书上敲一下代码.大二下学期,就丢掉了不用了.最近由 ...