实际就是接口,继承这个接口类实现多态。
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,
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)