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));
    
             
    
            }
    
  • 相关阅读:
    静态资源的映射
    controller进行数据保存
    接收的参数为日期类型时
    分页助手(pagehelper)
    逆向工程(generator)----->由表帮我们来生成dao、bean、xml
    动态sql语句(即sql语句的拼接)
    添加对象时如何把生成的id返回
    $和#的区别
    关联查询
    字段与属性不匹配的解决方法
  • 原文地址:https://www.cnblogs.com/Alex-Mercer/p/13354463.html
Copyright © 2011-2022 走看看