• C# 利用Autofac批量接口注入依赖【学习记录】


    背景:

      本人在一位大佬的Colder框架中看到了这个接口注入,然后呢就想学习一下ioc思想与di设计模式。此写法给我的感觉就是

    非常的 优雅 ,优雅永不过时。关于接口注入的概念和ioc和di具体是什么?可以参考下方的推荐的地址学习。话不多说,开撸。

    安装:

      打开nuget管理工具,将我下面标红色的包都进行安装(注:千万别安装错了,按照名字不差的安装)

      

    使用:

      我们新建一个DI的文件夹,在文件夹中增加一个接口:IDependency.cs

    namespace Coldairarrow
    {
        /// <summary>
        /// 注入标记
        /// </summary>
        public interface IDependency
        {
    
        }
    }

        先不要问问什么后面会解释。

        后面:其实。。就是这个依赖注入的一个原理吧。根据这个接口去找依赖的实现。

        推荐去这个地址看一下:https://www.cnblogs.com/atomy/p/12834804.html

        好了,继续分别新建Student.cs,StudentRepository.cs,IStudentRepository.cs三个类。StudentRepository.cs里面的具体业务根据需要自行修改,这里是为了测试使用。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    
    namespace ByzkApi
    {
        public  class Student
        {
            public int Id { get; set; }
            public string Name { get; set; }
            public string Graduation { get; set; }
            public string School { get; set; }
            public string Major { get; set; }
        }
    }
    using Coldairarrow;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    
    namespace ByzkApi
    {
        public class StudentRepository : IStudentRepository,IDependency
        {
            public Student Add(Student item)
            {
                throw new NotImplementedException();
            }
    
            public bool Delete(int id)
            {
                throw new NotImplementedException();
            }
    
            public Student Get(int id)
            {
                return new Student() { Name = "张三" };
            }
    
            public IEnumerable<Student> GetAll()
            {
                throw new NotImplementedException();
            }
    
            public bool Update(Student item)
            {
                throw new NotImplementedException();
            }
        }
    }
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ByzkApi
    {
        public interface IStudentRepository
        {
            IEnumerable<Student> GetAll();
            Student Get(int id);
            Student Add(Student item);
            bool Update(Student item);
            bool Delete(int id);
    
        }
    }

    注意:这里好好看一下 StudentRepository 是实现了两个接口分别是 IStudentRepository IDependency(注入标记) 

    最关键的地方来了,我们打开项目启动的函数Application_Start,然后注入一下接口依赖。

    using Autofac;
    using Autofac.Extras.DynamicProxy;
    using Autofac.Integration.Mvc;
    using Autofac.Integration.WebApi;
    using ByzkApi.Controllers;
    using ByzkApi.Interface;
    using Coldairarrow;
    using Microsoft.Extensions.DependencyInjection;
    using System.Linq;
    using System.Reflection;
    using System.Web.Compilation;
    using System.Web.Http;
    using System.Web.Mvc;
    using System.Web.Optimization;
    using System.Web.Routing;
    
    namespace ByzkApi
    {
        public class WebApiApplication : System.Web.HttpApplication
        {
            protected void Application_Start()
            {
                //初始化Autofac
                InitAutofac(GlobalConfiguration.Configuration);
    
    
                AreaRegistration.RegisterAllAreas();
                GlobalConfiguration.Configure(WebApiConfig.Register);
                FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
                RouteConfig.RegisterRoutes(RouteTable.Routes);
                BundleConfig.RegisterBundles(BundleTable.Bundles);
            }
    
    
    
    
            private void InitAutofac(HttpConfiguration config)
            {
                var builder = new ContainerBuilder();
    
    
                var baseType = typeof(IDependency);
    
                //可以进行筛选如: Where(x => x.FullName.Contains("Coldairarrow"))
                var assemblys = BuildManager.GetReferencedAssemblies().Cast<Assembly>()
                    .ToList();
    
                //自动注入IDependency接口,支持AOP,生命周期为InstancePerDependency
                builder.RegisterAssemblyTypes(assemblys.ToArray())
                    .Where(x => baseType.IsAssignableFrom(x) && x != baseType)
                    .AsImplementedInterfaces()
                    .PropertiesAutowired()
                    .InstancePerDependency()
                    .EnableInterfaceInterceptors()
                    .InterceptedBy(typeof(Interceptor));
    
                //注册Controller
                builder.RegisterControllers(assemblys.ToArray())
                    .PropertiesAutowired();
                builder.RegisterApiControllers(assemblys.ToArray()).PropertiesAutowired();
           
                //AOP
                builder.RegisterType<Interceptor>();
                builder.RegisterWebApiFilterProvider(config);
    
                var container = builder.Build();
                DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
                var resolver = new AutofacWebApiDependencyResolver(container);
                GlobalConfiguration.Configuration.DependencyResolver = resolver;
                AutofacHelper.Container = container;
            }
    
        }
    }

    到此为止就已经注入完成了~

    使用:

        这个接口注入好了之后可以在普通的Controller使用,也可以在apiController进行使用,分别看一下效果,结束。

      Controller:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    
    namespace ByzkApi.Controllers
    {
        public class HomeController : Controller
        {
            readonly IStudentRepository repository;
            //构造器注入
            public HomeController(IStudentRepository repository)
            {
                this.repository = repository;
            }
    
    
    
            public ActionResult Index()
            {
    
                var a = repository.Get(1);
    
                ViewBag.Title = a.Name;
    
                return View();
            }
        }
    }

      运行结果:

      ApiController:(如果想要多个接口只需要实现接口的时候进行继承IDependency就可)

      

    using ByzkApi.Interface;
    using Coldairarrow.Web;
    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Linq;
    using System.Web;
    using System.Web.Http;
    
    namespace ByzkApi.Controllers
    {
        public class TestApiController : ApiController
        {
            readonly IStudentRepository repository;
    
            public ITest _test { get; }
            //构造器注入
            public TestApiController(IStudentRepository repository, ITest test)
            {
                this.repository = repository;
                _test = test;
            }
    
            [HttpGet]
            public DataTable test(string sql)
            {
                repository.Get(1);
                var data = _test.GetTest("sql 语句");
                //repository.GetTest(sql);
                return data;
            }
        }
    }

      运行效果:

      

     

    从前慢,车马慢。 一生只爱一个人。
  • 相关阅读:
    Redis使用:聚合类型为空时,会自动被Redis删除
    Effective C++: 04设计与声明
    select引起的服务端程序崩溃问题
    Effective C++: 03资源管理
    Effective C++: 02构造、析构、赋值运算
    Effective C++: 01让自己习惯C++
    Centos7.2 安装配置 Tengine(nginx)
    Centos7更新阿里yum源
    Go中函数作为值、类型传递。
    go实现冒泡排序和快速排序
  • 原文地址:https://www.cnblogs.com/BFMC/p/15739371.html
Copyright © 2020-2023  润新知