zoukankan      html  css  js  c++  java
  • .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));
    
             
    
            }
    
  • 相关阅读:
    Codechef EDGEST 树套树 树状数组 线段树 LCA 卡常
    BZOJ4319 cerc2008 Suffix reconstruction 字符串 SA
    Codechef STMINCUT S-T Mincut (CodeChef May Challenge 2018) kruskal
    Codeforces 316G3 Good Substrings 字符串 SAM
    Codechef CHSIGN Change the Signs(May Challenge 2018) 动态规划
    BZOJ1396 识别子串 字符串 SAM 线段树
    CodeForces 516C Drazil and Park 线段树
    CodeForces 516B Drazil and Tiles 其他
    CodeForces 516A Drazil and Factorial 动态规划
    SPOJ LCS2
  • 原文地址:https://www.cnblogs.com/Alex-Mercer/p/13354463.html
Copyright © 2011-2022 走看看