C#.NET MVC中IOC容器 AutoFac的简单使用

时间:2024-04-13 13:13:11

网上查看了很多文章,照着复制的代码,始终不对,后面发现有些是缺少引用,有些缺失代码,我这里也是照搬被人的代码做了一些改动,先上项目结构图:
新建WEB MVC项目,我使用的VS是2017版
C#.NET MVC中IOC容器 AutoFac的简单使用
1,添加引用,使用nugut添加两个引用:Autofac,Autofac.Mvc5(很多别的文章都没有说要添加Autofac.Mvc5,可能是使用的版本不一样,这里都使用的最新版)
2,Model添加一个实体类

    public class UserInfo
    {
        public string Name { get; set; }

        public int Age { get; set; }
    }

3,Iservice添加一个接口

    public interface IUserInfoService
    {
        List<UserInfo> GetUsers();
    }

4,Service实现接口

  public class UserInfoService : IUserInfoService
    {
        public List<UserInfo> GetUsers()
        {

            var list = new List<UserInfo>();
            list.Add(new UserInfo { Age = 18, Name = "张三" });
            list.Add(new UserInfo { Age = 25, Name = "李四" });
            list.Add(new UserInfo { Age = 25, Name = "王五" });
            return list;
        }
    }

5,正式使用,在MVC项目中创建一个autofac的注册类

  public class AutofacConfig
    {
        /// <summary>
        /// 负责调用autofac框架实现业务逻辑层和数据仓储层程序集中的类型对象的创建
        /// 负责创建MVC控制器类的对象(调用控制器中的有参构造函数),接管DefaultControllerFactory的工作
        /// </summary>
        public static void Register()
        {
            //实例化一个autofac的创建容器
            var builder = new ContainerBuilder();

            //告诉Autofac框架,将来要创建的控制器类存放在哪个程序集 (AutoFacMvcDemo)
            Assembly controllerAss = Assembly.Load("AutofacIOCDemo");
            builder.RegisterAssemblyModules(controllerAss);
	
            builder.RegisterControllers(Assembly.GetExecutingAssembly());

            //如果有Dal层的话,注册Dal层的组件
            //告诉autofac框架注册数据仓储层所在程序集中的所有类的对象实例
            //Assembly dalAss = Assembly.Load("IService");
            //创建respAss中的所有类的instance以此类的实现接口存储
            //builder.RegisterTypes(dalAss.GetTypes()).AsImplementedInterfaces();

            //告诉autofac框架注册业务逻辑层所在程序集中的所有类的对象实例
            Assembly serviceAss = Assembly.Load("Service");

            //创建serAss中的所有类的instance以此类的实现接口存储
            builder.RegisterTypes(serviceAss.GetTypes()).AsImplementedInterfaces();


            //创建一个Autofac的容器
            var container = builder.Build();
            //将MVC的控制器对象实例 交由autofac来创建
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
        }
    }

6,在Global的Application_Start中启用autofac注册类

 protected void Application_Start()
        {
   			//注册
            AutofacConfig.Register();

            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }

7,在控制器中调用获取userinfo数据,并在视图中展示出来

        private IUserInfoService userinfoService;
        public HomeController(IUserInfoService _userinfoService,) {
             userinfoService = _userinfoService;
        }
        public ActionResult Index()
        {
            List<UserInfo> users = userinfoService.GetUsers();
             ViewBag.users = users;
            return View();
        }
@{
    ViewBag.Title = "Home Page";
}

@foreach (var item in ViewBag.users)
{
    <tr>
        <td>@item.Age</td>
        <td>@item.Name</td>
    </tr>
}

8,补充单个注册的方式,之前的方式是用注册类注册所有的Service,这里是单个注册,不用注册类

   protected void Application_Start()
        {

            // 创建autofac管理注册类的容器实例
            var builder = new ContainerBuilder();
            //注册组件(注意:在注册时添加了UserInfoService的引用,其实还是耦合的,在不分层的项目中好用)
            builder.RegisterType<UserInfoService>().As<IUserInfoService>();
            //使用Autofac提供的RegisterControllers扩展方法来对程序集中所有的Controller一次性的完成注册
            builder.RegisterControllers(Assembly.GetExecutingAssembly());
            //生成具体的实例
            //var container = builder.Build();
            //下面就是使用MVC的扩展 更改了MVC中的注入方式.
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));



            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }

9,原文地址:https://www.cnblogs.com/wyy1234/p/9144669.html,我这里做了一点改动,刚学习,有不对的地方或者可以改进的地方请大家指点一下,谢谢