• 使用Nuget添加Autofac.MVC的引用
  • 启动项设置
  • 注册Controller
  • 注册ModelBinder
  • 注册相关的web abstraction
  • 为View层启用属性注入
  • 为Action Filter启用属性注入

使用Nuget添加Autofac.MVC的引用

启动项设置

 protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes); var builder = new ContainerBuilder(); builder.RegisterType<BookService>().As<IBookService>();
builder.RegisterType<Logger>().As<ILogger>(); // Register your MVC controllers. (MvcApplication is the name of
// the class in Global.asax.)
builder.RegisterControllers(typeof(MvcApplication).Assembly); // OPTIONAL: Register model binders that require DI.
builder.RegisterModelBinders(typeof(MvcApplication).Assembly);
builder.RegisterModelBinderProvider(); // OPTIONAL: Register web abstractions like HttpContextBase.
builder.RegisterModule<AutofacWebTypesModule>(); // OPTIONAL: Enable property injection in view pages.
builder.RegisterSource(new ViewRegistrationSource()); // OPTIONAL: Enable property injection into action filters.
builder.RegisterFilterProvider(); // Set the dependency resolver to be Autofac.
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}

注册Controller

  1. 注册当前程序集下的所有Controller

    1. builder.RegisterControllers(typeof(MvcApplication).Assembly);
  2. 注册单个Controller
    1. builder.RegisterType<HomeController>().InstancePerRequest();

注册ModelBinder

  1. 在启动项中注册ModelBinder
    1. builder.RegisterModelBinders(typeof(MvcApplication).Assembly);
      builder.RegisterModelBinderProvider();
  2. 自定义ModelBinder并且设置ModelBinderTypeAttribute
    [ModelBinderType(typeof(Book))]
public class BookModelBinder : IModelBinder
{
public ILogger logger;
public BookModelBinder(ILogger logger)
{
this.logger = logger;
}
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
HttpRequestBase request = controllerContext.HttpContext.Request; string title = request.Form.Get("Title");
string BookID = request.Form.Get("BookID");
string day = request.Form.Get("Day");
string month = request.Form.Get("Month");
string year = request.Form.Get("Year"); return new Book { BookID=BookID, Title=title+":DI Test"+this.logger.Log("dsa")+request.Form.Get("HttpRequestBaseDI"), Date=year+"-"+month+"-"+day };
} }

注册相关的Web Abstract Class

  1. 启动项设置

    // OPTIONAL: Register web abstractions like HttpContextBase.
      builder.RegisterModule<AutofacWebTypesModule>();

  2. 实例(在ModelBinder中使用HttpRequestBase)
   [ModelBinderType(typeof(Book))]
public class BookModelBinder : IModelBinder
{
ILogger logger;
HttpRequestBase request1;
public BookModelBinder(ILogger logger, HttpRequestBase request)
{
this.logger = logger;
this.request1 = request;
}
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
HttpRequestBase request = controllerContext.HttpContext.Request;
request = request1;
string title = request.Form.Get("Title");
string BookID = request.Form.Get("BookID");
string day = request.Form.Get("Day");
string month = request.Form.Get("Month");
string year = request.Form.Get("Year"); return new Book { BookID=BookID, Title=title+":DI Test"+this.logger.Log("dsa")+request.Form.Get("HttpRequestBaseDI"), Date=year+"-"+month+"-"+day };
} }

在View层实现属性注入

  1. 启动项设置

    builder.RegisterSource(new ViewRegistrationSource());
  2. 实现自定义的ViewPage

    这里的例子使用的是一个强类型的View,所以实现了一个泛型ViewPage

    public abstract class CustomViewPage<T> : WebViewPage<T>
        {
            public ILogger Logger { get; set; }
        }

  3. View设置
@inherits MVC5Practices.Infrastructure.CustomViewPage<MVC5Practices.Infrastructure.Book>

@{
Layout = null;
} <!DOCTYPE html> <html>
<head>
<meta name="viewport" content="width=device-width" />
<title>ShowBook</title>
</head>
<body>
<div>
<h4>Book</h4>
<h5>@Logger.Log("dsa")</h5>
<hr />
<dl class="dl-horizontal">
<dt>
@Html.DisplayNameFor(model => model.Title)
</dt> <dd>
@Html.DisplayFor(model => model.Title)
</dd> <dt>
@Html.DisplayNameFor(model => model.Date)
</dt> <dd>
@Html.DisplayFor(model => model.Date)
</dd> </dl>
</div>
<p>
@Html.ActionLink("Edit", "Edit", new { id = Model.BookID }) |
@Html.ActionLink("Back to List", "Index")
</p>
</body>
</html>

为ActionFilter启用属性设置

  1. 启动项设置

    // OPTIONAL: Enable property injection into action filters.
    builder.RegisterFilterProvider();

  2. 自定义Filter
 public class CustomActionFilter : ActionFilterAttribute
{
public ILogger Logger { get; set; } public override void OnActionExecuting(ActionExecutingContext filterContext)
{
Logger.Log("OnActionExecuting");
}
}

ASP.NET MVC 5 使用autofac实现DI的更多相关文章

  1. ASP.NET MVC IOC 之AutoFac

    ASP.NET MVC IOC 之AutoFac攻略 一.为什么使用AutoFac? 之前介绍了Unity和Ninject两个IOC容器,但是发现园子里用AutoFac的貌似更为普遍,于是捯饬了两天, ...

  2. Ioc容器Autofac系列(2)-- asp.net mvc中整合autofac

    经过上篇蜻蜓点水的介绍后,本篇通过实例快速上手autofac,展示当asp.net mvc引入了autofac之后会带来什么. 创建Asp.net MVC并引入Autofac 首先,创建一个MVC站点 ...

  3. Asp.net mvc中整合autofac

    创建Asp.net MVC并引入Autofac 首先,创建一个MVC站点,为方便起见,选初始带HomeController和AccountController的那种.然后通过NuGet或到Autofa ...

  4. [转]ASP.NET MVC IOC 之AutoFac攻略

    本文转自:http://www.cnblogs.com/WeiGe/p/3871451.html 一.为什么使用AutoFac? 之前介绍了Unity和Ninject两个IOC容器,但是发现园子里用A ...

  5. ASP.NET MVC IOC 之AutoFac攻略

    一.为什么使用AutoFac? 之前介绍了Unity和Ninject两个IOC容器,但是发现园子里用AutoFac的貌似更为普遍,于是捯饬了两天,发现这个东东确实是个高大上的IOC容器~ Autofa ...

  6. .NET手记-为ASP.NET MVC程序集成Autofac

    MVC Autofac总是会紧跟最新版本的ASP.NET MVC框架,所以文档也会一直保持更新.一般来讲,不同版本的框架集成Autofac的方法一般不变. MVC集成需要引用 Autofac.Mvc5 ...

  7. ASP.NET MVC+WCF+NHibernate+Autofac 框架组合(一)

    学习了Spring.NET+NHibernate的框架,觉得Spring.NET框架不够轻量,配置来配置去的比较头疼,所以把Spring.NET换成了Autofac框架,同时加入WCF框架整了一个组合 ...

  8. asp.net MVC中使用Autofac小结 (遇到的最傻错误: 没有为该对象定义无参数的构造函数)

    项目使用的MVC4,.net 4.5 Nuget安装最新的autofac,一直提示不支持.net 4.5.没办法了,最后用Nuget控制台安装的老版本.因为我使用的是MVC4,所以直接安装的是auto ...

  9. 如何在asp.net mvc 中使用Autofac 控制反转(Ioc)

    前言 最近看了一些关于Ioc方面的开源项目,里面的类跳来转去,看的迷迷糊糊的.项目里根本不需要这么“复杂的”设计,只需简单完成Ico,达到解耦的目的,并且能高效的完成项目.于是参考autofac的官网 ...

随机推荐

  1. Android零碎知识

    1.当启动一个APP时按下后退键会调用onBackPressed方法. 如果想要屏蔽后退键只需要重写onBackPressed方法如下即可: @Override public void onBackP ...

  2. 给空签名包进行签名以及找不到keystore证书链问题的解决方案

    转 http://blog.csdn.net/u011106842/article/details/49683865

  3. 关于Django 错误 doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS

    记录一下 报错 doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS\ 这个问题出现没 ...

  4. MySQL/MariaDB/PerconaDB-提权条件竞争漏洞

    背景 2016年11月01日,国外安全研究员Dawid Golunski在 MySQl, MariaDB 和 PerconaDB 数据库中发现条件竞争漏洞,该漏洞允许本地用户使用低权限(CREATE/ ...

  5. XMind怎么使用查找功能

    XMind思维导图中,XMind搜索功能与XMind查找替换功能乍一看有些相似,然而不尽相同,本文为你着重讲解XMind搜索功能. 首先在XMind思维导图中的工具栏找到"Search&qu ...

  6. VR、AR、MR的区别

    VR.AR.MR定义: 什么是虚拟现实? 虚拟现实(Virtual Reality,简称VR,又译作灵境.幻真)是近年来出现的高新技术,也称灵境技术或人工环境.虚拟现实是利用电脑模拟产生一个三维空间的 ...

  7. bootstrap兼容性问题

    转自--http://blog.csdn.net/chenhongwu666/article/details/41513901/ 让IE6 IE7 IE8 IE9 IE10 IE11支持Bootstr ...

  8. C#的接口

    什么是接口?其实,接口简单理解就是一种约定,使得实现接口的类或结构在形式上保持一致.个人觉得,使用接口可以使程序更加清晰和条理化,这就是接口的好处,但并不是所有的编程语言都支持接口,C#是支持接口的. ...

  9. LinuxMint配置Git(图文教程)

    1.生成秘钥(直接回车,秘钥存放路径看命令行信息) 2.打开秘钥,需要注意的是.ssh可能是隐藏的,这时需要Ctrl+H显示隐藏文件夹 3.复制秘钥,添加到GitHub(Settings), 4.添加 ...

  10. mysql 数据类型拾遗

    写这篇博客的原因是在建表的过程我建表时,在表名和字段名上没有注意,违背了团队的开发规范.我们团队规范是,名字上要能够体现对象的特征. 比如: 数据库要写db_dbname 表名要写tb_tbname ...