.NET 依赖注入Autofac实践

项目之前用的是Ninject,最近比较流行AutoFac,所以决定自己倒持配置一下,不过之前是比较简单。项目框架是从.netframework4.0升级到了4.5,刚开始运行报错,因为视图的配置文件没有跟着一起更改,改后跑起来了。

<configSections>
    <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
      <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
      <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
    </sectionGroup>
  </configSections>

这是后来更改的版本号

<configSections>
    <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
      <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
      <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
    </sectionGroup>
  </configSections>

还有这个也要改

<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />

因为框架是通过nuget升级安装的,所以大的配置文件就不需要更改了。其实这个版本号要是不放心直接新建一个MVC空项目,直接把配置信息拷贝过来即可。

好了,现在言归正传,具体注入AutoFac

1.要在Nuget管理包下载AutoFac与AutoFac.MVC5

2.添加服务层的IUserRepository、IClassRepository接口与对应实现。

3.修改global配置文件

#region 注入
        //这里一定要注意,首先依赖关系接口一定要设置为静态的,并且是public。不然用到的时候无法调用。
        public static IContainer container { get; set; }
        public void Dependency()
        {
            //实例化控制器
            var builder = new ContainerBuilder();
            //注册类型(映射实现类)
            builder.RegisterType<ClassRepository>().As<IClassRepository>();
            builder.RegisterType<UserRepository>().As<IUserRepository>();
            //注册到控制器
            builder.RegisterControllers(Assembly.GetExecutingAssembly());
            container = builder.Build();
            //下面就是使用MVC的扩展 更改了MVC中的注入方式.
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
        }

调用Dependency方法

protected void Application_Start()
        {
            Dependency();
            AreaRegistration.RegisterAllAreas();
            …………
        }

4.为了减少每次controller里面都对字段的定义,现在在公共的控制器定义对应的字段,公共的控制器:BaseController

        #region Autofac依赖注入
        protected IUserRepository UserRepository;
       
        protected  IClassRepository ClassRepository; 

        #endregion

5.在具体的控制器里面对其构造函数依赖注入

 public UserOperatorController(IUserRepository userRepository)
        {
            UserRepository = userRepository;
        }

 6.后面具体调用就可以了,是不是很简单啊,小功告成。

原文地址:https://www.cnblogs.com/songStar/p/8464849.html