ASP.NET MVC Autofac依赖注入的一点小心得(包含特性注入)
ASP.NET MVC Autofac依赖注入的一点小心得(包含特性注入)
IOC的重要性 大家都清楚..便利也都知道..新的ASP.NET Core也大量使用了这种手法..
一直憋着没写ASP.NET Core的文章..还是怕误导大家..
今天这篇也不是讲Core的
前面写了C#开发移动应用系列 就第一篇和最后一篇上了最多推荐 - - 也许大家确实不看好吧..
算了..废话不多说.开始今天的东西吧..
本篇文章不讲为何我们要用IOC..只讲Autofac使用中的一些小心得
1.基本注入
首先我们要构造一个容器,代码如下:
//第一步: 构造一个AutoFac的builder容器 ContainerBuilder builder = new ContainerBuilder();
第二步..注入自己需要的服务和继承关系. 类似下面:
//注入仓储 builder.RegisterGeneric(typeof(Repository<,>)).As(typeof(IRepository<,>)).InstancePerLifetimeScope();
嗯..这里解释一下是什么意思..
RegisterGeneric 注入你的服务类,后面的As则是你服务类继承的接口.
InstancePerLifetimeScope为你注入的这个服务的生命周期.(注:生命周期我们后面讲)
2.控制器注入
采用属性注入的方式,注入控制器
//注入控制控制器 builder.RegisterControllers(assemblys.ToArray()).PropertiesAutowired().InstancePerLifetimeScope();
嗯..这里面的assemblys.ToArray().. 就是一些你要注入到控制器里面的程序集..
嗯 我是直接通过统一接口 然后批量注入..你们自己随意..
PropertiesAutowired()的意思就是采用属性注入的方式
3.特性注入
我们在使用MVC的时候,肯定会用到特性..肯定会有一些自己定义的特性..那么这些特性里面要用到相关的服务,该怎么注入呢..如下:
//注入特性 builder.RegisterFilterProvider();
是的.. 你没看错..MVC里面就一句话就行了..特性里面就可以取到想要的服务了..(注:WebAPI不可以,具体请查官方文档)
4.生成容器并提供给MVC
代码如下:
//通过容器配置生成容器. var container = builder.Build(); //提供给MVC DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
5.一些杂七杂八
//注入类用这个 builder.RegisterType(要注入的类型) //注入泛型类用这个 builder.RegisterGeneric(要注入的类型)
6.关于生命周期
InstancePerDependency()
瞬时,嗯..就是服务对于每次请求都会返回单独的实例
InstancePerLifetimeScope()
基于线程或者请求的单例..嗯 就是一个请求 或者一个线程 共用一个
SingleInstance()
嗯..没别的 就是单例.. 整个项目公用一个
InstancePerRequest()
嗯..针对MVC的,或者说是ASP.NET的..每个请求单例
到此就结束了.
嗯..内容不多,胜在实用..分享一下吧, 有问题的地方希望大神指正一下,也顺便是自己的一个记录吧..
1
2
3
4
5
|
[Obsolete( "Containers should generally be considered immutable. Register all of your dependencies before building/resolving. If you need to change the contents of a container, you technically should rebuild the container. This method may be removed in a future major release." )] public void Update(IContainer container) { this .Update(container, ContainerBuildOptions.None); } |
代码如下:
1
2
3
4
5
6
7
8
9
|
public class WxController : System.Web.Mvc.Controller { public IWxMessageHandlerContract WxMessageHandlerContract { get ; set ; } public ActionResult Index( string signature, string timestamp, string nonce, string echostr) { //这里进行对WxMessageHandlerService的构造参数赋值 } } |
1
2
3
4
5
|
public partial interface IWxMessageHandlerContract : IScopeDependency { } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public partial class WxMessageHandlerService : MessageHandler<WxMessageContext>, IWxMessageHandlerContract { /// <summary> /// /// </summary> /// <param name="inputStream"></param> /// <param name="postModel">接收腾讯postXML解析后的对象</param> /// <param name="maxRecordCount"></param> public WxMessageHandlerService(Stream inputStream, PostModel postModel, int maxRecordCount = 0) : base (inputStream, postModel, maxRecordCount) { } } |
请教如何在WxController中WxMessageHandlerService的构造注入传参?