IOC autofac 在asp.net mvc中的使用

ico是和autofac这些是什么我都不用多解释了。

最近一直在autofac官网看他们的文档,本人英语水平不太好。全靠翻译软件进行学习。今天对autofac和mvc的结合的学习进行一个总结。废话不多说,现在开始! 

首先创建好一个mvc的项目,创建好相对应的接口和实现类,然后创建好控制器和视图以便于测试,我的开发工具是vs2017。

1. 安装 mvc 的 autofac 插件: 在Guget直接搜索 “autofac” 和 “autofac.mvc5” 进行安装,下面的图片是我做好的测试类。类里面实现了很简答的几个方法。

2. 在Global文件中进行编写 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using Autofac.Integration.Mvc;
using Autofac;
using System.Reflection;

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

            var builder = new ContainerBuilder(); 
            builder.RegisterControllers(typeof(MvcApplication).Assembly).PropertiesAutowired(); //把当前程序集中的controller都进行注册

        Assembly[] assemblies =new Assembly[] { Assembly.Load("Test") }; //生命一个可变数组,可以加载多个类库
        builder.RegisterAssemblyTypes(assemblies).Where(t=>!t.IsAbstract).AsImplementedInterfaces().PropertiesAutowired(); // 获取所有相关类库的程序集

            var container = builder.Build();
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

        }
    }
}

 3. 控制器代码如下

using ITest; 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MVC_autofac.Controllers
{
    public class UserInfoController : Controller
    {

        public IUserInfo UserInfo { get; set; }
        // GET: Default
        public ActionResult Index()
        {
            bool b = UserInfo.CheckLogin("aaa", "123");
            return Content(b.ToString());
        }
    }
}

4. 但是在有的时候会出现没有注入到的地方(比如 Helper中),如果想获取对象,就要使用以下代码。首先我在mvc项目里创建了一个 TestHelper 类,代码如下

using ITest;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MVC_autofac
{
    public class TestHelper
    {
        public static void Test()
        {
            IUserInfo userInfo = DependencyResolver.Current.GetService<IUserInfo>();//使用这个方式来对未注册类的实例化
            userInfo.CheckLogin("aaa", "123");
        }
    }
}

5. 如果在 Quart 等单独线程中,是无法通过  DependencyResolver.Current.GetService<接口名>() 直接获取的  就要使用下面的方式

  定义一个实现 IJob 借口的类

using ITest;
using Quartz;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Autofac;
using Autofac.Integration.Mvc;

namespace MVC_autofac
{
    public class TestJob : IJob
    {
        public void Execute(IJobExecutionContext context)
        {
            try
            {

                // IUserInfo userInfo = DependencyResolver.Current.GetService<IUserInfo>();

                IUserInfo userInfo;
                var container = AutofacDependencyResolver.Current.ApplicationContainer;
                using (container.BeginLifetimeScope())
                {
                    userInfo = container.Resolve<IUserInfo>();
                }

                userInfo.CheckLogin("aaa", "123");
            }
            catch (Exception ex)
            {

            }
        }
    }
}

6. 源码下载地址

链接:https://pan.baidu.com/s/1Ac0N4VzjuviIKnSzvExdDw 密码:ilg5

猜你喜欢

转载自www.cnblogs.com/xujunheng/p/9131461.html
今日推荐