.NET MVC5+AUTOFAC实战

Posted 沧海·

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了.NET MVC5+AUTOFAC实战相关的知识,希望对你有一定的参考价值。

这几天研究IOC容器、DI:
解耦,不用一个个实例化(理解到这了)面向接口编程思想

于是昨天实验了一把MVC中如何使用IOC、构造函数注入
话不多说上代码:
小框架一拉

展开细说

Model:

(懒的改名)

    public class Class1
    
        public int Id  get; set; 
        public string Name  get; set; 
        public string Grade  get; set; 
    

仓储Resitory:

定义一个接口

   public  interface IStudentResitory
    
        string GetName(int id);
    

实现一个接口:

public   class StudentResitory:IStudentResitory
    
        public string GetName(int id)
        
            switch (id)
            
                case 3:
                    return "yhf";
                case 4:
                    return "zjj";
                case 5:
                    return "jwz";
                default:
                    return "ddd";
            
        
    

Service:

定义一个接口

用构造函数注入IStudentResitory

  public  class Service :IService
    
        private readonly IStudentResitory _studentRepository;

        public Service(IStudentResitory studentResitory)
        
            this._studentRepository = studentResitory;
        
        public  string GetName(int id)
        
            return this._studentRepository.GetName(id);
        
    

Ioc:


安装包Autofac

 public static  class MvcContainer
    
        public static IContainer Instance;
        public static System.Web.Mvc.IDependencyResolver Init(Func<ContainerBuilder, ContainerBuilder> func = null)
        
            var builder = new ContainerBuilder();//新建容器用于注册组件
            MyBuild(builder);//注册组件
            func?.Invoke(builder);
            Instance = builder.Build();//利用构建器创建容器
            return new AutofacDependencyResolver(Instance);//返回针对MVC的解析器 
        
        public static void MyBuild(ContainerBuilder builder)
        
            //注册仓储层
            Assembly repositoryAssembly = Assembly.Load("Repository");
            builder.RegisterAssemblyTypes(repositoryAssembly)
                .PublicOnly()   //只要public访问权限的
                .Where(cc => cc.IsClass)    //只要class类型的(排除值和interface类型)
                .AsImplementedInterfaces(); //自动以其实现的接口暴露(包括Dispose接口)

            //注册逻辑层
            Assembly serviceAssembly = Assembly.Load("Service");
            builder.RegisterAssemblyTypes(serviceAssembly)
                .PublicOnly()
                .Where(cc => cc.IsClass)
                .AsImplementedInterfaces();

            Assembly MvcAssembly = Assembly.Load("CESHI");
            builder.RegisterControllers(MvcAssembly);//注册MVC项目中的Controller

         
    

回到MVC项目中 Global.asax文件在编译的时候执行我们注册组件的方法

   protected void Application_Start()
        
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            try
            
                System.Web.Mvc.IDependencyResolver autofacResolver = MvcContainer.Init();
                DependencyResolver.SetResolver(autofacResolver);
            
            catch (Exception ee)
            

                throw new Exception(ee.ToString());
            
        

最后在我们HomeController中通过构造函数的方法依赖注入
注意也要安装AUTOFAC

  private readonly IService _service; 
        public HomeController(IService service)
        
            this._service = service;
        
        [HttpGet]
        public string GetNameById(int id)
        
            return _service.GetName(id);
        

注意配置config:

  <dependentAssembly>
        <assemblyIdentity name="Autofac" publicKeyToken="17863AF14B0044DA" culture="neutral"/>
        <bindingRedirect oldVersion="0.0.0.0-6.2.0.0" newVersion="6.2.0.0"/>
      </dependentAssembly>

最终效果

以上是关于.NET MVC5+AUTOFAC实战的主要内容,如果未能解决你的问题,请参考以下文章

一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar]

一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar]

mvc5整合Autofac

为ASP.NET MVC程序集成Autofac

MVC5+EF+AutoFac+AutoMapper轻型架构

使用AutoFac实现依赖注入