热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

第七节:WebApi与Unity整合进行依赖注入和AOP的实现

一.IOC和DI1.通过Nuget引入Unity程序集。PS:【版本:5.8.6】2.新建DIFactory类,用来读取Unity的配置文件并创建U

一. IOC和DI

1. 通过Nuget引入Unity程序集。

    PS:【版本:5.8.6】

2. 新建DIFactory类,用来读取Unity的配置文件并创建Unity容器,需要注意的是DIFactory类需要声明成单例。

PS:这里采用静态构造函数(必须是无参的)的形式来实现单例,MVC框架的那个框架采用的是 双if+lock锁的形式实现的单例,结果都一样。

代码分享:

1 ///

2 /// 依赖注入工厂(单例的 采用静态构造函数)3 /// 读取Unity的配置文件,并创建Unity容器4 /// 需要引入程序集“System.Configuration”5 /// 6 public class DIFactory7 {8 private static IUnityContainer _Container = null;9 static DIFactory()
10 {
11 //1. 固定的4行代码读取配置文件
12 ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
13 fileMap.ExeConfigFilename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory + "CfgFiles\\UnityConfig.xml");//找配置文件的路径
14 Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
15 UnityConfigurationSection section = (UnityConfigurationSection)configuration.GetSection(UnityConfigurationSection.SectionName);
16 //2. Unity层次的步骤
17 _Container = new UnityContainer();
18 //加载节点的名称为"apiContainer"
19 section.Configure(_Container, "apiContainer");
20 }
21
22 ///
23 /// 对外开放函数,用来获取Unity容器
24 ///

25 ///
26 public static IUnityContainer GetContainer()
27 {
28 return _Container;
29 }
30 }

3. 新建UnityDependencyResolver类,用来自定义控制器实例化工厂.

特别注意:该类这里实现的是IDependencyResolver接口,来自WebApi下的程序集,而非MVC,所以和MVC下的写法有区别.

代码分享:

1 public class UnityDependencyResolver : IDependencyResolver2 {3 private IUnityContainer _IUnityContainer = null;4 public UnityDependencyResolver(IUnityContainer unityContainer)5 {6 this._IUnityContainer = unityContainer;7 }8 9 ///


10 /// 获取单个服务
11 ///

12 ///
13 ///
14 public object GetService(Type serviceType)
15 {
16 try
17 {
18 return this._IUnityContainer.Resolve(serviceType);
19 }
20 catch (ResolutionFailedException ex)//因为会累计构造多个对象,很多是没有去扩展,直接null就行
21 {
22 return null;
23 }
24 }
25
26 public IEnumerable GetServices(Type serviceType)
27 {
28 try
29 {
30 return this._IUnityContainer.ResolveAll(serviceType);
31 }
32 catch (ResolutionFailedException)
33 {
34 return new List();
35 }
36 }
37
38 public IDependencyScope BeginScope()//每次请求
39 {
40 var child = this._IUnityContainer.CreateChildContainer();
41 return new UnityDependencyResolver(child);
42 }
43
44 public void Dispose()
45 {
46 this._IUnityContainer.Dispose();
47 }
48 }

4. 新建CfgFiles文件夹和UnityConfig.xml文件,该xml文件需要改属性为“始终复制”。

代码分享:


5. 在WebApiConfig文件中进行配置,把webapi的DependencyResolver换成自己的Unity版本的

config.DependencyResolver = new UnityDependencyResolver(DIFactory.GetContainer());

6. 新建Service文件夹和Interface文件夹,分别创建TestService类和ITestService接口,并去UnityConfig.xml文件中进行注册(上述xml里已经注册好了)。

代码如下:

1 public class TestService : ITestService
2 {
3 public string GetInfor()
4 {
5 return "我是ypf";
6 }
7 }

1 public interface ITestService
2 {
3 string GetInfor();
4 }

7. 在控制器中进行构造函数的注入,注入TestService对象。

public class EighthController : ApiController{private ITestService _ITestService = null;public EighthController(ITestService testService){this._ITestService = testService;}[HttpGet]public string GetInfor(){var result = _ITestService.GetInfor();return result;}}

 

8. 利用PostMan进行测试 http://localhost:2131/api/Eighth/GetInfor, 测试成功。

 

 

二. AOP

1. 通过Nuget引入Unity.Interception程序集,同时会自动把它依赖的Unity.Abstractions程序集引入。

PS:【版本:5.5.3】

2. 新增TestService2类和ITestService2接口,用来测试AOP。

代码如下:

1 public interface ITestService22 {3 string GetInfor2();4 }5 public class TestService2 : ITestService26 {7 public string GetInfor2()8 {9 return "我是ypf2";
10 }
11 }

3. 新建AOP文件夹,并新建LogBeforeBehavior类,实现IInterceptionBehavior接口,在Invoke中写AOP相关的代码。

1 ///

2 /// Unity为我们提供了一个IInterceptionBehavior接口需要实现这个接口3 /// 接口为我们提供了三个方式(GetRequiredInterfaces、Invoke、WillExecute)实现4 /// WillExecute表示是否执行该行为,如果是false这个方法被调用时,不会被捕捉。因为我们总是要执行的,所以为true5 /// GetRequiredInterfaces将你想要的接口类型和行为联系起来,我们暂时不需要,所以返回Type.EmptyTypes6 /// Invoke执行方式接口,我们主要使用它7 /// 8 public class LogBeforeBehavior : IInterceptionBehavior9 {
10 public bool WillExecute
11 {
12 get { return true; }
13 }
14
15 public IEnumerable GetRequiredInterfaces()
16 {
17 return Type.EmptyTypes;
18 }
19
20 public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
21 {
22 Console.WriteLine("我是方法执行前执行的业务");
23
24 //下面这句话表示这里执行方法
25 var result = getNext()(input, getNext);
26 return result;
27 }
28 }

4. 在UnityConifig.xml文件中配置AOP相关的代码,并且给TestService2注入的代码配置AOP相关的LogAopBehavior类。

代码分享:

1 2 3

4 5 6 7 8 9
10
11
12
13
14
15
18
19
20
21
22

23

24

25

26

 

5. 用PostMan进行测试 http://localhost:2131/api/Eighth/GetInfor2 ,通过加断点,发现:执行方法前,先进入了LogBeforeBehavior类中进行执行了。


推荐阅读
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
author-avatar
不得不无奈啊
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有