文档章节

Asp.Net MVC三层架构之autofac使用教程

o
 osc_y8yehimr
发布于 2019/03/20 11:16
字数 693
阅读 9
收藏 0

精选30+云产品,助力企业轻松上云!>>>

开发环境:vs2015、.net4.5.2、mvc5、ef6

Autofac简介

IOC控制反转(Inversion of Control,缩写为IOC),Autofac是一个开源的依赖注入框架,Autofac是asp.net中比较常用的IOC容器之一

IOC的目标是消除代码中的new(实例化)语句,把实例化类的控制权转移到别的地方,这个地方通常会在一个程序加载时只执行一次的全局方法中,达到解耦的目的。

DI依赖注入(Dependency Injection,缩写为DI),组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。

三层架构

Autofac安装

通过Nuget安装Autofac和Autofac.Mvc5

Autofac配置

1、App_Start文件夹里新建AutoFacConfig.cs

using System;
using System.Reflection;
using System.Web.Mvc;
using Autofac;
using Autofac.Integration.Mvc;
namespace cms.Web
{
    public class AutoFacConfig
    {
        public static void Register()
        {
            var builder = new ContainerBuilder();

            builder.RegisterControllers(Assembly.GetCallingAssembly())//注册mvc的Controller
                .PropertiesAutowired();//属性注入


            //1、无接口类注入
            //builder.RegisterType<BLL.newsClassBLL>().AsSelf().InstancePerRequest().PropertiesAutowired();
            

            //2、有接口类注入
            //注入BLL,UI中使用
            builder.RegisterAssemblyTypes(typeof(BLL.BaseBLL<>).Assembly)
                .AsImplementedInterfaces()  //是以接口方式进行注入
                .InstancePerRequest()       //每次http请求
                .PropertiesAutowired();     //属性注入

            //注入DAL,BLL层中使用
            builder.RegisterAssemblyTypes(typeof(DAL.BaseDAL<>).Assembly).AsImplementedInterfaces()
                .InstancePerRequest().PropertiesAutowired();     //属性注入

            //Cache的注入,使用单例模式
            //builder.RegisterType<RedisCacheManager>()
            //    .As<ICacheManager>()
            //    .SingleInstance()
            //    .PropertiesAutowired();

            //移除原本的mvc的容器,使用AutoFac的容器,将MVC的控制器对象实例交由autofac来创建
            var container = builder.Build();
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

        }
    }
}

 

2、Global.asax配置Autofac

protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles); 

            BundleTable.EnableOptimizations = true;//js、css压缩
            MiniProfilerEF6.Initialize();//MiniProfiler监控ef
            GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();//webapi默认JSON
            AutoFacConfig.Register();//autofac:控制反转,依赖注入配置
        }

 

Autofac使用

使用构造函数注入

using System;
using System.Web.Mvc;
using cms.Model;
using cms.IBLL;
//using cms.BLL;   

//不需要应用bll,但需要引用IBLL
namespace cms.Web.Areas.Admin.Controllers
{
    public class NewsController : BaseController
    {
        //未使用Autofac前直接实例化的写法
        //public newsBLL bll = new newsBLL();

      //autofac属性注入 public InewsClassBLL bll { get; set; }

[HttpPost] [ValidateAntiForgeryToken] [ValidateInput(false)] public ActionResult Add(news vmodel,FormCollection forms) { news model = new news(); model.title = Request["title"]; model.times = DateTime.Now; model = bll.Add(model); if (model.ID > 0) { return RedirectToAction("list"); } ViewData["mess"] = "添加失败"; return View(vmodel); } public ActionResult Edit(int id) { news model = bll.Find(id); return View(model); } // GET: Admin/Admins/Delete/5 public ActionResult Delete(int id) { if (bll.Delete(id)) { return Redirect(Request.UrlReferrer.ToString()); } else { Common.JSHelper.AlertRedirect("操作失败", Request.UrlReferrer.ToString()); } return RedirectToAction("list"); } } }

 //ui层不再依赖于BLL,只依赖于IBLL,BLL可以随意变动

end

下一篇: Shell调试
o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

Fetch方法封装、业务实践

  说Fetch之前啊,我们不得不说一说Ajax了,以前使用最多的自然是jQuery封装的Ajax方法了,强大而且好用。   有人说了,jQuery的Ajax都已经封装得那么好了,你还整Fetch干什么,这不是多...

osc_8nnvoyb1
34分钟前
14
0
在 Visual Studio 市场中发布项目扩展

  比较不错的开源项目中,尤其是类似于AbpNext这种级别的项目,我们都想要快速的尝试,如何提供快速给开发者提供模板是我们的一大难题。不过在VisualStudio中并没有这么难。 一.本地发布插...

osc_1wo6kipk
35分钟前
7
0
5000+字硬核干货!Redis 分布式集群部署实战

原理: Redis集群采用一致性哈希槽的方式将集群中每个主节点都分配一定的哈希槽,对写入的数据进行哈希后分配到某个主节点进行存储。 集群使用公式(CRC16 key)& 16384计算键key数据那个槽。...

osc_2jegjdnw
36分钟前
12
0
Jmeter(十四) - 从入门到精通 - JMeter定时器 - 下篇(详解教程)

1.简介   用户实际操作时,并非是连续点击,而是存在很多停顿的情况,例如:用户需要时间阅读文字内容、填表、或者查找正确的链接等。为了模拟用户实际情况,在性能测试中我们需要考虑思考...

osc_yy65eb2q
38分钟前
0
0
Redis 6.0 访问控制列表ACL说明

背景 在Redis6.0之前的版本中,登陆Redis Server只需要输入密码(前提配置了密码 requirepass )即可,不需要输入用户名,而且密码也是明文配置到配置文件中,安全性不高。并且应用连接也使用...

osc_zwv9uj8l
39分钟前
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部