C#的依赖注入,谁能明白些讲解一下,感觉快明白了,就差一些些了,大牛救命。。。

C#的依赖注入,谁能明白些讲解一下,感觉快明白了,就差一些些了,大牛救命。。。,第1张

实际就是接口,继承这个接口类实现多态。

internal interface IServiceClass
    {
        String ServiceInfo();
    }//继承接口,A
    internal class ServiceClassA : IServiceClass
    {
        public String ServiceInfo()
        {
            return "我是ServceClassA";
        }
    }//继承接口,b
    internal class ServiceClassB : IServiceClass
    {
        public String ServiceInfo()
        {
            return "我是ServceClassB";
        }
    }

2、有个类使用这个类,但私有字段是接口,使用的时候传入具体的实例化对象

internal class ClientClass

    {
        //定义依赖接口
        private IServiceClass _serviceImpl;
        //用这个接口实现多态
        public void Set_ServiceImpl(IServiceClass serviceImpl)
        {
            this_serviceImpl = serviceImpl;
        }
 
        public void ShowInfo()
        {
            ConsoleWriteLine(_serviceImplServiceInfo());
        }
    }

3、具体运作

   class Program
    {
        static void Main(string[] args)
        {
            IServiceClass serviceA = new ServiceClassA();
            IServiceClass serviceB = new ServiceClassB();
            ClientClass client = new ClientClass();
 
            clientSet_ServiceImpl(serviceA);
            clientShowInfo();
            clientSet_ServiceImpl(serviceB);
            clientShowInfo();
        }
    }

注入方法几种,实际就是里氏替换值具体,取了另外一个名字,但用的跟多

区别是方法不同。
依赖注入实现了系统之间、模块之间和对象之间依赖关系的解耦,基本上是现代应用程序框架必不可少的一个组成部分。ABP的依赖注入系统是基于Microsoft的依赖注入扩展库,能够完全兼容netCore中的依赖注入的用法,同时使用Autofac替换了netCore中的内部容器,利用了Autofac中的一些特性。

所谓依赖注入,是指程序运行过程中,如果需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖于外部的注入。
Spring的依赖注入对调用者和被调用者几乎没有任何要求,完全支持对POJO之间依赖关系的管理。依赖变量是一个与独立变量相反的一个变量,也就是指除了因变量外的其他变量改变时会影响到该变量。
举例来说,有一关系模式R(A1,A2,,An),X和Y均为(A1,A2,,An)的子集,对于R的值r来说,当其中任意两个元组u,v中对应于X的那些属性分量的值均相等时,则有u,v中对应于Y的那些属性分量的值也相等,称X函数决定Y,或Y依赖于X,记为X->Y。

在添加 APIRoute 节点时,会对endpoint进行解析,生成 依赖树 , get_dependant 便是解析出endpoint的依赖树的函数。

这部分在之前源码解析中讲过,但是当时的理解并不深刻。这次让我们来认真剖析这部分

get_dependant 不止被endpoint使用,其依赖项和子依赖都会使用,其为递归函数。
开头生成一个 Dependant节点对象 ,等待下面加工,最终被返回。其形成的是一个 树状结构

接下来把该节点的参数都抓出来,逐个分析。

首先判断是否为 Depends() 项,如果是,则生成子依赖。下面是生成子依赖的流程。

拿出Depends中的依赖内容,如果没有就用注解来充当。即 user: User = Depends() 这种形式可以被允许。

接下来是对安全相关的处理。我们可以看到,中间又调用了 get_dependant ,参数包含了 name 和 security_scopes 。endpoint的根节点传参不包含这两项。

如果不是 Depends 参数,则首先默认当成查询参数query,并生成ModelField字段。

如果其为路径参数,则重新生成ModelField字段。再整合到dependant的参数列表中

不是路径参数,但是标准的查询参数

Query()和Header()两种情况

当上述条件都不满足,则可以断言为Body()字段。

就此,一个APIRoute的依赖树便生成了
下章说说如何使用依赖树

这里是endpoint的前一步,request首先要经过 solve_dependencies() 来与endpoint的依赖树进行匹配,这相当于API的门卫一般的存在。
匹配的结果包含在solve过程中的结果,错误,以及其他若干信息。 有了详细的信息,我们便能精确的定位到问题的所在。

上面这部分负责解决子依赖,拿到最后的结果集,然后用子依赖的结果集来解决自身

解决该节点的解决每一个依赖项

解决参数依赖,分别遍历依赖的个参数需求列表,与request所能提供的做匹配。
我们来看一下匹配的函数

solve_dependencies 本身也是递归函数,这和 get_dependant 是相辅相成的。

1 ,dragger 作用 利用注解,直接将对象注入到目标类,省去手动new的 *** 作,降低耦合
2,@inject 注解是代表类需要的对象,是指被注入的对象 类似mPresenter,也可修饰类构造方法,构造方法所需参数会自动在conponent的moudle中自动查找provides
3,@moudle 注解是指提供被注入对象创建的类 需要加@privodes 注解,代表提供的对象,
4,@conponent 组件注解是 结合inject和moudle 对注入类进行注入,或者提供公共基础对象
5,@singleton 单例表示作用域或者生命周期,单例生命周期和application相同,使用单例的conponent 不能依赖生命周期小于application的
6,@Scope 需要自定义 表示Moudle 或者conponent生命周期 例如@AcitivityScope @FragmentScope

使用注意事项

7,


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/13346872.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-19
下一篇 2023-07-19

发表评论

登录后才能评论

评论列表(0条)

保存