码迷,mamicode.com
首页 > Web开发 > 详细

MVC中Autofac的使用

时间:2018-08-26 15:35:51      阅读:203      评论:0      收藏:0      [点我收藏+]

标签:csdn   htm   手动   view   esc   route   pos   压缩   load   

网上大佬的原地址:

https://www.cnblogs.com/liupeng/p/4806184.html

https://blog.csdn.net/qq_37214567/article/details/78227628?locationnum=2&fps=1

一、需要引用的文件,使用Nuget安装

第一个为Autofac

第二个为Autofac的MVC扩展

技术分享图片

二、项目结构

测试使用的表名称为SysSample,图中2-6为其BLL、DAL、IBLL、IDAL、Models 项目。

技术分享图片

三、关系

技术分享图片

四、使用

1、构造函数注入

(1)自动注入。BLL、Controller  均是由Autofac统一注入

a.创建一个 统一被继承的接口,IDependency

技术分享图片

b.引用。BLL、IBLL、DAL、IDAL 四个项目均引用IDependency所在的Apps.AutofacBase项目。

c.继承.。ISysSampleBLL和ISysSampleRepository均继承此接口

 技术分享图片

d.构造函数。SysSampleBLL和SysSampleController构造函数修改。

技术分享图片

e.Web项目的引用。Web需要添加对BLL、IBLL、DAL、IDAL四个项目的引用。否则自动注入时,缺少未引用项目的注入信息。

f.Application_Start()方法的修改

技术分享图片

技术分享图片
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Web;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
using Apps.AutofacBase;
using Apps.BLL;
using Apps.DAL;
using Apps.IBLL;
using Apps.IDAL;
using Autofac;
using Autofac.Integration.Mvc;

namespace Apps.Web
{
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            RouteConfig.RegisterRoutes(RouteTable.Routes);

            //启用jscss压缩
            BundleTable.EnableOptimizations = true;
            BundleConfig.RegisterBundles(BundleTable.Bundles);

            #region 自动注入

            //创建autofac管理注册类的容器实例
            var builder = new ContainerBuilder();
            Assembly[] assemblies = Directory.GetFiles(AppDomain.CurrentDomain.RelativeSearchPath, "*.dll").Select(Assembly.LoadFrom).ToArray();
            //注册所有实现了 IDependency 接口的类型
            Type baseType = typeof(IDependency);
            builder.RegisterAssemblyTypes(assemblies)
                   .Where(type => baseType.IsAssignableFrom(type) && !type.IsAbstract)
                   .AsSelf().AsImplementedInterfaces()
                   .PropertiesAutowired().InstancePerLifetimeScope();

            //注册MVC类型
            builder.RegisterControllers(assemblies).PropertiesAutowired();
            builder.RegisterFilterProvider();
            var container = builder.Build();
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
            #endregion

        }
    }
}
View Code

(2)手动注入

无需创建IDependency接口。

需要将所有需要注入的类、接口、调用者一一列出。

Application_Start()方法的修改

技术分享图片

技术分享图片
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Web;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
using Apps.AutofacBase;
using Apps.BLL;
using Apps.DAL;
using Apps.IBLL;
using Apps.IDAL;
using Apps.Web.Controllers;
using Autofac;
using Autofac.Integration.Mvc;

namespace Apps.Web
{
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            RouteConfig.RegisterRoutes(RouteTable.Routes);

            //启用jscss压缩
            BundleTable.EnableOptimizations = true;
            BundleConfig.RegisterBundles(BundleTable.Bundles);

            #region 手动注入

            //创建autofac管理注册类的容器实例
            var builder = new ContainerBuilder();
            
            /*需要进行依赖注入的IBLL*/
            //类和接口的关系
            builder.RegisterType<SysSampleRepository>().As<ISysSampleRepository>();       
            builder.RegisterType<SysSampleBLL>().As<ISysSampleBLL>();

            //调用者的注入。
            builder.RegisterType<SysSampleBLL>().InstancePerDependency();//SysSampleBLL中调用了DAL层

            //(不推荐)单个Controller控制器注册
            builder.RegisterType<SysSampleController>().InstancePerDependency();//SysSampleController调用的BLL层


            //(推荐写法)使用Autofac提供的RegisterControllers扩展方法来对程序集中所有的Controller一次性的完成注册                        
            //builder.RegisterControllers(Assembly.GetExecutingAssembly()).PropertiesAutowired();
            //生成具体的实例
            var container = builder.Build();
            //下面就是使用MVC的扩展 更改了MVC中的注入方式.
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));



            #endregion

        }
    }
}
View Code

2.属性注入

(1)自动注入。

a.与1.(1) 构造函数注入的自动注入 配置,大部分一致,

b.需要修改的地方。注入调用者时,需要在最后面加上.PropertiesAutowired();

技术分享图片

 

引用的对象,将构造函数修改为属性。

技术分享图片

 (2)手动注入

a.与2.(1) 同理,大部分一致

b.需要修改的地方。百度上说注入调用者时,需要在最后面加上.PropertiesAutowired();

但是在实际调用时,仍然调用失败。未进行深入研究。

技术分享图片

五、备注

为书写和观看方便,当前使用的是。自动注入+属性注入。

MVC中Autofac的使用

标签:csdn   htm   手动   view   esc   route   pos   压缩   load   

原文地址:https://www.cnblogs.com/masonblog/p/9537326.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!