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的..每个请求单例

 

 到此就结束了.

 

 

最后

嗯..内容不多,胜在实用..分享一下吧, 有问题的地方希望大神指正一下,也顺便是自己的一个记录吧..

作者:顾振印 出处:http://www.cnblogs.com/GuZhenYin/ 如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面
 
分类: ASP.NET MVC
好文要顶 关注我 收藏该文 微信分享
9
0
 
 
 
« 上一篇: C#开发移动应用系列(4.调用系统应用,以及第三方应用(调用与被调用))
» 下一篇: 应用程序的8个关键性能指标以及测量方法
posted @ 2017-07-07 15:56  GuZhenYin  阅读(7786)  评论(3)  编辑  收藏  举报
 
 
#1楼 2017-07-07 17:41 那一剑风情
builder.Update(container); 提示已过时,请问有什么替代方法吗?
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);
    }
#2楼 2017-07-08 11:01 xiao99
请教MVC控制器注入如何进行有参构造的注入?
代码如下:

1
2
3
4
5
6
7
8
9
public class WxController : System.Web.Mvc.Controller
    {
public IWxMessageHandlerContract WxMessageHandlerContract { getset; }
 
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的构造注入传参?
#3楼 2017-07-10 11:47 那一剑风情
@ xiao99
1
container.Resolve<IWxMessageHandlerContract>(new NamedParameter("inputStream", inputStream),new NamedParameter("postModel", postModel),new NamedParameter("maxRecordCount", 1));

posted on 2024-09-26 19:53  漫思  阅读(7)  评论(0编辑  收藏  举报

导航