.Net 依赖注入以及AOP切面

.Net 依赖注入

参考地址

https://www.cnblogs.com/webapi/p/10563735.html
https://www.cnblogs.com/xyh9039/archive/2019/08/07/11318247.html
https://www.cnblogs.com/Warmsunshine/p/9067321.html

为什么要使用依赖注入

依赖注入

  • 如果类A的实现需要借助类B,那么类B就被称作类A的依赖。需要交给ICO容器去解耦。
  • 把依赖的创建丢给其它人,自己只负责使用,其它人丢给你依赖的这个过程理解为注入
    微软文档

简单说明
个人理解依赖注入

  • 1.Startup 添加服务注册的生命周期 AddSingleton,AddTransient,AddScoped
  • 2.控制器构造函数要求传入 接口,将本地的接口赋值

老张的

控制反转(IOC)

老张 依赖注入系列
https://www.cnblogs.com/laozhang-is-phi/p/9541414.html //里面也是包含了依赖注入
https://www.cnblogs.com/laozhang-is-phi/p/11520048.html //上面文章是2.0,3.0需要看这个

MVC依赖注入以及AOP切面编程

Nuget

Autofac.Extras.DynamicProxy //动态代理,用于AOP,安装会自动安装依赖 Autofac
Autofac.Mvc //mvc 依赖注入

需要注入的类

   public interface ITestSayHello 
        {
            void Say();
        }

   public class TestSayHello : ITestSayHello
        {
            public virtual void Say()
            {
                Console.WriteLine("Hello");
            }
        }

需要的AOP切面类

    public class AOPTest : IInterceptor
    {
        public void Intercept(IInvocation invocation)
        {
            Console.WriteLine("开始前");
            invocation.Proceed();
            Console.WriteLine("开始后");
        }
    }

Global.asax 修改

Application_Start 方法增加

  MvcContainer.Register();//autofac:控制反转,依赖注入配置

创建代理类

   public static class MvcContainer
    {
        public static void Register()
        {
            var builder = new ContainerBuilder();

            builder.RegisterControllers(Assembly.GetCallingAssembly())//注册mvc的Controller
                .PropertiesAutowired();//属性注入

            builder.RegisterType<AOP.AOPTest>();//AOP注册

            builder.RegisterType<TestTemp.TestSayHello>()
            .AsImplementedInterfaces()//自动以其实现的所有接口类型暴露(包括IDisposable接口)
            .EnableClassInterceptors()//动态AOP代理
            .InterceptedBy(typeof(AOP.AOPTest));
            //也可以直接类注入,不过类里面的方法需要用虚方法实现

            //移除原本的mvc的容器,使用AutoFac的容器,将MVC的控制器对象实例交由autofac来创建
            var container = builder.Build();
           
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

        }

配合EF使用,不使用接口,直接类注册
https://www.cnblogs.com/daryl/p/7778190.html 三种生命周期

 public static void Register()
        {
            var builder = new ContainerBuilder();

            builder.RegisterControllers(Assembly.GetCallingAssembly())//注册mvc的Controller
                .PropertiesAutowired();//属性注入
           // builder.RegisterType<AOP.AOPTest>().EnableClassInterceptors(); AOP切面注入

            builder.RegisterType<DB>().InstancePerLifetimeScope();//全局注册 db实例

            builder.RegisterType<Helper.EFHelper>();//ef通用查询方法

            //移除原本的mvc的容器,使用AutoFac的容器,将MVC的控制器对象实例交由autofac来创建
            var container = builder.Build();
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

        }

Api依赖注入

原本我以为在mvc完成依赖注入后,可以直接调用 ApiController 依赖注入,却发现报错了
报错内容 类型Controllers.ApiController”没有默认构造函数
后来一查,原来之前安装的是mvc依赖注入,api也有专门的依赖注入 Autofac.WebApi2

安装Autofac.WebApi2

原先的需要修改如下

   public static void Register()
        {
            var builder = new ContainerBuilder();
     

            builder.RegisterControllers(Assembly.GetCallingAssembly())//注册mvc的Controller
                .PropertiesAutowired();//属性注入

            builder.RegisterApiControllers(Assembly.GetCallingAssembly())//注册Api的Controller
              .PropertiesAutowired();//属性注入

            // builder.RegisterType<AOP.AOPTest>().EnableClassInterceptors(); AOP切面注入

            builder.RegisterType<OAData>().InstancePerLifetimeScope();//全局注册

            builder.RegisterType<Helper.EFHelper>();//ef通用查询方法

            //移除原本的mvc的容器,使用AutoFac的容器,将MVC的控制器对象实例交由autofac来创建
            var container = builder.Build();


            #region Api依赖注入
            HttpConfiguration config = GlobalConfiguration.Configuration;//注意此处HttpConfiguration类的 config对象,一定不要new,要从GlobalConfiguration获取
            config.DependencyResolver = (new AutofacWebApiDependencyResolver(container)); 
            #endregion


            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

         

        }
posted @ 2020-07-21 13:11  Alex_Mercer  阅读(344)  评论(0编辑  收藏  举报