ASP.NET MVC 5 使用autofac实现DI

  • 使用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");
        }
    }
时间: 2024-08-07 21:21:07

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

Asp.net mvc中整合autofac

创建Asp.net MVC并引入Autofac 首先,创建一个MVC站点,为方便起见,选初始带HomeController和AccountController的那种.然后通过NuGet或到Autofac官网下载来引入类库.个人推荐前者,因为从VS2010开始,已内集可视化的NuGet功能,使用起来非常方便.如下图所示: 这是vs2012的界面,点击“Manage NuGet Packages…”,弹出窗体如下,在右上角搜索框中输入“Autofac”,找到对应的库点击安装即可.这里需要应用的库有两

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

经过上篇蜻蜓点水的介绍后,本篇通过实例快速上手autofac,展示当asp.net mvc引入了autofac之后会带来什么. 创建Asp.net MVC并引入Autofac 首先,创建一个MVC站点,为方便起见,选初始带HomeController和AccountController的那种.然后通过NuGet或到Autofac官网下载来引入类库.个人推荐前者,因为从VS2010开始,已内集可视化的NuGet功能,使用起来非常方便.如下图所示: 这是vs2012的界面,点击"Manage NuG

在asp.net mvc 中使用Autofac

据说.net 世界里,最强的依赖注入容器是Autofac .不管是谁,Nopcommerce2.8 用了它,所以就简单研究一下喽. 用vs 2012 创建一个Asp.net mvc3 的样例项目.然后使用NuGet(Vs2012 自带的有,版本低的话,似乎要安装插件),下载安装autofac的dll,如图1,2. 图1 NuGet 图2 ,load  autofac autofac 要加载两个dll哦,一个是autofac 的core ,另外一个是和asp.net mvc3集成的dll 然后,我

Asp.Net Mvc IOC之Autofac

正文: Autofac(表面意思为自动工厂),那么我理解为Autofac干的事情就是工厂做的事情,在框架的搭建中为了解耦以及便于日后维护等原因通常都使用接口技术,配合使用反射技术得到程序集实例(也是解耦)相当于返回实现了接口的子类,这就是工厂.这里总结使用autofac构造函数依赖注入的学习心得: 1.我一开始用Asp.Net进行了试验autofac(只是试一试): 从上面可以看到,在myService的构造函数内进行了注入,引用autofac.dll之后,接下来在应用程序一开始就执行的(也只是

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

学习了Spring.NET+NHibernate的框架,觉得Spring.NET框架不够轻量,配置来配置去的比较头疼,所以把Spring.NET换成了Autofac框架,同时加入WCF框架整了一个组合. 本来想把NHibernate换成EF的,因为现在普通用的.net 4.0,但是.net 4.0里的EF对Oracle支持没那么好,.net4.5有了oracle新的驱动就挺好用了. 一点点心得,NHibernate也是刚熟悉,给像我一样的新手参考,一起学习,有什么不够合理的地方还请多多指教. 数

ASP.NET MVC IOC 之 Autofac(二)

在上一章节,我们已经知道了再控制器中如何注入以及使用了.这一章,我们重点讲解下,如何在服务层中使用. 我们新定义一个教师类,在服务层中,通过这个教师类服务层,获取学生的年龄.实现在教师类的服务层中调用了学生类的服务接口对象. 新建一个教师类接口:ITeacherService.cs namespace AutoFacTest.Service { public interface ITeacherService { int GetStudentAge(string name); } } 接着定义一

ASP.NET MVC Boilerplate简介

ASP.NET MVC Boilerplate简介 ASP.NET MVC Boilerplate是专业的ASP.NET MVC模版用来创建安全.快速.强壮和适应性强的Web应用或站点.它在微软默认MVC模版之上提供了要求最少的代码实现. 使用此模版的主要好处: 安全 性能 搜索引擎优化 (SEO) 可访问性 浏览器兼容 弹性和错误处理 简单调试和性能测试工具 设计模式和最佳实践 搜索 ASP.NET MVC Boilerplate 技术路线图 为什么需要ASP.NET MVC Boilerpl

ASP.NET Core Web 应用程序系列(二)- 在ASP.NET Core中使用Autofac替换自带DI进行批量依赖注入(MVC当中应用)

原文:ASP.NET Core Web 应用程序系列(二)- 在ASP.NET Core中使用Autofac替换自带DI进行批量依赖注入(MVC当中应用) 在上一章中主要和大家分享在MVC当中如何使用ASP.NET Core内置的DI进行批量依赖注入,本章将继续和大家分享在ASP.NET Core中如何使用Autofac替换自带DI进行批量依赖注入. PS:本章将主要采用构造函数注入的方式,下一章将继续分享如何使之能够同时支持属性注入的方式. 约定: 1.仓储层接口都以“I”开头,以“Repos

Asp.Net MVC 之 Autofac 初步使用3 集成web api

今天我们试着在WebApi2实现autofac的注入,关于这方面也是看了几位园友的分享省了不少时间,所以结合着前篇的demo再新建webapi进行... demo3下载地址: http://pan.baidu.com/s/1eSCAZtC 一样开篇还是发下大概demo结构: 还是nuget安装 Autofac 以及 Autofac ASP.NET MVC 5  Integration .Autofac ASP.NET WEB API 2.2 Integration 看到有园友说属性注入存在安全隐