Autofac通过构造函数注入

752 阅读2分钟

这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战**

Autofac通过构造函数注入

如前一篇所示,获取实例都是通过构造函数进行。此处通过构造函数获取实例,还有一种通过构造函数传入IServiceProvider进行获取。该方法可以极大减少构造函数传入的实例过多所导致的构造函数参数臃肿。示例直接使用前篇项目做拓展,在控制器的测试api下面,直接使用。有关示例如下图所示:

 

设置断点,并运行程序查看效果。可见IWeskyTest接口已经被注入进来,并且可以访问到

 

Autofac通过属性注入方式

在ServiceA实现类里面,添加IServiceB、IServiceC的属性。并且在ServiceA实现类里面,添加一个测试方法 Hey(),在里面对以上两个属性所对应的接口方法进行调用。代码如下:

 

以及Hey需要加入到抽象类接口IServiceA:

 

对IServiceA\B\C进行服务注册。其中,提供属性的服务,注册时候必须使用PropertiesAutowired方式,如下面代码所示:

 

接着改写控制器里面的Test方法进行测试。对应代码以及解释和对应的运行结果如下图所示:

 

Autofac通过方法注入方式

改写上面ServiceA的类为如下代码。有关代码说明如图:

 

对用到的IServiceA和B进行服务注册。如图所示,ServiceA里面提供了方法注入,所以需要在注册A服务的时候,使用OnActivated方法。其中,RegisterService是ServiceA服务里面提供的需要当做方法注入的方法,方法里面的IServiceB是需要被方法注入的抽象类(接口)。以下使用了瞬时,也可以使用其他的,没有限制,包括ServiceB服务注册时候,也可以使用非单例模式,不做限制。

 

运行程序,如果先后打印ServiceA 和 ServiceB,则代表方法注入成功。运行程序结果如下:

 

Filter过滤器里面实现支持依赖注入

先编写一个过滤器WeskyFilter,继承自 ActionFilterAttribute。并且在里面添加一个属性注入的IServiceC和一个构造函数注入的IServiceD。

然后在OnActionExecuting和OnActionExecuted方法下面实现一个打印的内容,并且分别打印ServiceC实例和ServiceD实例下面的Hello方法。代码如下:

 

对IServiceC、D进行服务注册,以及注册WeskyFilter过滤器,用以支持依赖注入:

 

在控制器里面的Test方法上面,添加过滤器标记,并直接运行进行结果验证:

 

如图所示,打印出过滤器里面的内容,并且成功访问到了ServiceC和D的Hello方法,代表在过滤器里面实现依赖注入也是可以的。

以上就是本篇文章的全部内容,谢谢观看。