第五节 .NetFramework框架依赖注入技术实现
.NetFramework框架不提供默认依赖注入容器对依赖注入技术进行实现,如果所开发程序项目是基于.NetFramework框架且这个项目需要使用依赖注入技术进行实现,常用的手段有两种:
1、使用微软自己提供MEF(Managed Extensibility Framework(托管可扩展框架)) 容器,MEF对应.NetFramework和.NetCore框架分别有两个不同的版本,.NetFramework框架使用MEF的版本需要引用程序集中的“System.ComponentModel.Composition”。而.NetCore框架使用MEF的版本则需要通过NuGet插入依赖“System.Composition”。
2、使用第三方Autofac依赖注入容器对依赖注入技术进行实现。
通过在接口以及相应的属性上定义对应的[Export]--[Import]注解,MEF隐式的实例化类型对象。通过MEF依赖注入容器通过[Export]--[Import]注解实现依赖注入相比于默认赖注入容器和Autofac依赖注入容器其依赖注入的实现是最为容易的,所需要的代码量也是最少的。这也侧面反映出MEF的封装相比来说也是最为黑盒和严密的,开发者也是最难以理解其内部实现逻辑的。
#region 方法--重写
/// <summary>
/// 【模型创建】
/// <param name="modelBuilder">模型生成器实例。</param>
/// <remarks>
/// 摘要:
/// OnModelCreating方法可以被用来重载与定制规定我们的模型类如何与我们的数据表进行映射的映射规则。
/// </remarks>
/// </summary>
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//移除复数表名的契约,即实体类与数据库表名的单复数形式相同
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
if (MappingConfigurationEnumerable == null)
{
return;
}
//逐一的从映射配置实例集合的枚举数实例中选出一个指定的映射配置实例,在数据库中映射并生成符合此映射规则相应的表和字段。
foreach (var item in MappingConfigurationEnumerable)
{
item.ApplyConfiguration(modelBuilder.Configurations);
}
}
#endregion
#region 方法--重写
/// <summary>
/// 【模型创建】
/// <param name="modelBuilder">模型生成器实例。</param>
/// <remarks>
/// 摘要:
/// OnModelCreating方法可以被用来重载与定制规定我们的模型类如何与我们的数据表进行映射的映射规则。
/// </remarks>
/// </summary>
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
//动态加载所有实体映射配置实体。
// 通过程序集查找继承于指定父类的类型,找到后动态加载所有实体映射配置实体,
//实际上通过程序集查找获取指定类型的实例,而不通过“new”关键字获取指定类型的实例,
//就是依赖注入的一种方式,此方式被称为:叫“依赖查找”(Dependency Lookup)。
IEnumerable<Type> _entityTypeConfigurationEnumerable = Assembly.GetExecutingAssembly().GetTypes().Where(type =>
(type.BaseType?.IsGenericType ?? false)
&& (type.BaseType.GetGenericTypeDefinition() == typeof(EntityTypeConfiguration<>)));
foreach (Type item in _entityTypeConfigurationEnumerable)
{
IMappingConfiguration _mappingConfiguration = (IMappingConfiguration)Activator.CreateInstance(item);
_mappingConfiguration.ApplyConfiguration(modelBuilder);
}
base.OnModelCreating(modelBuilder);
}
#endregion
通过两个重写方法OnModelCreating的对比,可以发现MEF依赖注入的实现相比于其它的容器得更加的灵活。
/// <summary>
/// 【MEF依赖关系解析--类】
/// <remarks>
/// 宿主MEF并组合部件,用于对程序中相应对应的[Export]--[Import]注解对进行组合操作。
/// </remarks>
/// </summary>
public class MefDependencySolver
{
#region 属性--静态
/// <summary>
/// 【容器】
/// <remarks>
/// 摘要:
/// 宿主MEF并组合部件,用于对程序中相应对应的[Export]--[Import]注解对进行组合操作。
/// </remarks>
/// </summary>
public static CompositionContainer Container
{
get
{
AggregateCatalog _aggregateCatalog = new AggregateCatalog();
_aggregateCatalog.Catalogs.Add(new DirectoryCatalog(Directory.GetCurrentDirectory()));
_aggregateCatalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly()));
CompositionContainer _compositionContainer = new CompositionContainer(_aggregateCatalog);
//将部件(part)和宿主程序添加到组合容器
return _compositionContainer;
}
}
#endregion
}
通过MefDependencySolver类,可以看出MEF也可以通过程序集结接口和相应的实现进行组合。
Autofac依赖注入容器,通过下列代码在.NetFramework框架实现依赖注入。
//创建autofac管理注册类的容器实例。
var builder = new ContainerBuilder();
builder.RegisterControllers(typeof(TeacherGroupController).Assembly);//注册所有的Controller
//注册所有实现了 IDependency 接口的类型。
builder.RegisterType<EFContext>().As<IDBContext>().InstancePerLifetimeScope();
builder.Register(context => new UnitOfWork(new EFContext())).As<IUnitOfWork>().InstancePerLifetimeScope();
IContainer container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
而Autofac依赖注入的实现是通过拷贝构造方法显式的实例化类型对象。
19-12-25_MEFFramework(001控制台动态实例UnitOfWork调用模式,完成Insert、Update、Delete数据操作验证) -- https://download.csdn.net/download/zhoujian_911/12053595。
19-12-25_MEFFramework(002WEB动态实例UnitOfWork--MiniProfiler调用模式) --https://download.csdn.net/download/zhoujian_911/12053602。
AutofacFramework(001控制台调用Main方法通过Autofac实现的依赖注入,UnitOfWork调用模式) --https://download.csdn.net/download/zhoujian_911/12053616。
19-12-04_AutofacFramework(002WEB动态实例UnitOfWork--MiniProfiler调用模式,通过Autofac依赖注入) -- https://download.csdn.net/download/zhoujian_911/12053622。
第五节 .NetFramework框架依赖注入技术实现相关推荐
- 框架依赖注入和普通依赖注入_依赖注入快速入门:它是什么,以及何时使用它...
框架依赖注入和普通依赖注入 by Bhavya Karia 通过Bhavya Karia 介绍 (Introduction) In software engineering, dependency i ...
- spring依赖注入_Spring依赖注入技术的发展
spring依赖注入 回顾Spring框架的历史,您会发现在每个发行版中实现依赖注入的方法越来越多. 如果您使用该框架已经超过一个月,那么在这篇回顾性文章中可能不会发现任何有趣的东西. 除了Scala ...
- Spring依赖注入技术的发展
回顾Spring框架的历史,您会发现实现依赖注入的方式在每个发行版中都在增加. 如果您使用该框架已经超过一个月,那么在这篇回顾性文章中可能不会发现任何有趣的东西. 除了Scala中的最后一个示例,没有 ...
- 框架依赖注入和普通依赖注入_角服务和依赖注入解释
框架依赖注入和普通依赖注入 服务和喷油器 (Services and Injectors) Components are responsible for the data that renders i ...
- Android开源框架——依赖注入Dagger
介绍:Dagger是Square公司开发依赖注入框架,主要针对辅助类对象,而ButterKnife是针对View视图对象的. github:https://github.com/square/dagg ...
- Spring框架—③依赖注入DI、Bean作用域及自动装配
依赖注入 DI,Dependency injection 依赖: 指bean对象的创建依赖于Spring容器 注入: 指Bean对象所依赖的资源,由容器来设置和装配 在beans.xml中配置 1.常 ...
- spring 04-Spring框架依赖注入基本使用
Spring的依赖注入形式实际上所有对象产生控制都要通过applicationContext.xml文件实现 依赖注入必须启动容器后才可以进行该配置文件的内部的加载操作 依赖注入之有参构造 定义一个D ...
- Android开源框架——依赖注入ButterKnife
若对依赖注入不熟悉,请阅读博客中的另外一篇IOC控制反转浅析 介绍:ButterKnife是Square公司员工JakeWharton开发的一款针对View视图对象的依赖注入库.目的是通过依赖注入方式 ...
- php 依赖注入框架,依赖注入模式(Dependency Injection)
依赖注入模式(Dependency Injection) 由 学院君 创建于5年前, 最后更新于 10个月前 版本号 #3 18333 views 16 likes 0 collects 1.模式定义 ...
最新文章
- asp.net实现C#代码加亮显示
- vueRouter-命名视图
- MAC电脑安装Python3下的Jupyter Notebook
- Java10 新特性
- Spring boot(十二):Spring boot 如何测试、打包、部署
- LeetCode 1886. 判断矩阵经轮转后是否一致
- Hadoop ecosystem
- MySQL自动化审核平台部署说明
- 未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序 解决方案
- 海龟交易法则01_玩风险的交易者
- 虚拟机设计与实现:以jvm为例 pdf_Java虚拟机:Jvm概念和原理详解以及GC机制的分析...
- 创业维艰,且行且珍惜
- 华为云学院-人人学loT学习笔记及扩展- 第一章 初识物联网
- kafka7 探索生产者同步or异步发送消息
- 【RNNoise】用深度学习抑制噪声
- AX9000利用docker实现迅雷远程下载2
- pandas window中涉及的offset是什么意思
- 解决百度网盘下载限速 速度慢问题
- WordPress实现关注微信公众号回复关键字获取验证码查看网站隐藏内容
- ARM GICv3 ITS介绍及代码分析