VCommon.Ioc:依赖注入与调用拦截

作者:V君 发布于:2018-8-5 19:41 Sunday 分类:VCommon

此程序集作为通用应用程序基础类库(VCommon)一部分.

使用Unity容器实现基于接口的可拦截自动注册.

由于没有做太多依赖隔离铺垫, 在使用拦截和属性注入时仍需引用Unity相关类库.


源代码:SVNGit


这个程序集的内容并不多,但在应用程序框架中发挥了顶梁柱的作用.

让我们先来看看这个程序集的核心类--Ioc管理器.

它被定义成一个很传统的封闭单例.

在初始化时使用基础程序集中的TypeFinder来遍历全部程序集的类,

然后再使用反射扩展方法FilterInterfaces过滤出实现了注册接口的类

然后按照注册接口所指定的姿势注册到容器.


目前提供了4种注入接口,分别是:

ISingletonIocClass -- 注册为普通的单例

ISingletonIocClass<拦截器> -- 注册为带拦截器的单例

ITransientIocClass -- 注册为普通的每次实例化

ITransientIocClass<拦截器> -- 注册为带拦截器的每次实例化

这些接口只能实现其中的一个,初始化的时候会检查并抛出对应的异常信息.


注册方式没啥好讲的,我们来看看拦截器吧.

要使用拦截器,需要在注册接口填上拦截器实现类泛型参数,

拦截器实现类必须实现UnityIInterceptionBehavior接口,

可以继承通用的拦截器基类InterfaceInterceptorBase来减少重复工作.

拦截器基类将IInterceptionBehavior接口实现之后封装成两个抽象方法,

分别是调用前和调用后, (典型的AOP)

调用前传入时间, 调用方法和所在类,以及入参;

调用后则比上者多了三个参数, 分别是耗时,返参以及异常(如果有)

在应用程序框架中可以用来为面向接口实现的服务类提供依赖解析以及审计拦截.


除了提供按类解析实例之外还另外提供了手动注册方法,

如果一个项目中有多个类实现了同一个接口,很显然不知道哪个会被注册到容器,

在初始化完成之后可以手动注入来确保实现类被正确注册.

标签: 软件开发 C# .NET

引用地址:

发表评论:

Powered by emlog 去你妹的备案 sitemap