Angular / Typescript - 解释示例

时间:2016-11-01 11:59:40

标签: javascript angularjs oop asp.net-web-api typescript

作为序言,我对Javascript非常满意,并且在使用Typescript的项目中实现之前,我已经很好地完成了Angular。在仍然攀登Angular的学习曲线和用TS看到这种新的实现方式之间,它让我感到非常不知所措。

我暂停了AngularJS的低级学习并开始学习使用我们目前正在使用的技术的教程:Angular。带有WebApi的Typescript和Entity Framework。

我遇到了这个例子:https://blogs.msdn.microsoft.com/tess/2015/12/10/3b-services-getting-started-with-angularjs-typescript-and-asp-net-web-api/

对于我的实际问题,我做得很好,直到作者开始实施他的服务。我正在考虑我会采用的方式(使用我之前研究和学过的东西),作者用我的界面来描述服务本身:

  

创建DataAccessService

     
      
  1. 在app / common / services
  2. 下创建一个新的DataAccessService.ts文件   
  3. 添加描述DataAccessService的接口
  4.   
module app.common.services {
    interface IDataAccessService {
        getStoreResource(): ng.resource.IResourceClass<IStoreResource>;
    }
}

好的,从我的角度来看,他创建了一个函数,可以调用它来获取他想要的资源,但是这个实现的好处是什么,特别是接口(IDataAccessService)?然后他深入兔子洞并创建另一个接口(IStoreResource)以返回另一个接口(IStores)的资源:

  

DataAccessService只允许我们访问各种API   可能正在使用,在这种情况下是商店API的资源。我们可以   此处还有getAdResource()或getProductResource()的方法   例如,如果我们有API来获取广告或产品或类似产品。我们告诉它   返回一个ng.resource.IResourceClass,我们就可以了   定义那是什么。

     

将IStoreResource声明为IStores的资源......这是   解释将从哪些类型的项目返回或传递给   资源。这应该高于接口声明   IDataAccessService

interface IStoreResource extends ng.resource.IResource<app.domain.IStore> { }

此时相当丢失,但它仍在继续:

  

接下来我们将在下面实现DataAccessService   IDataAccessService接口

export class DataAccessService implements IDataAccessService {
   //minification protection
   static $inject = ["$resource"]
   constructor(private $resource: ng.resource.IResourceService) { }

   getStoreResource(): ng.resource.IResourceClass<IStoreResource> {
      return this.$resource("/api/stores/:id");
   }
}

我更好地遵循这一点,因为它是看起来正在做实际工作的部分。我们的函数将使我们的资源API返回我们需要的数据。但在我看来(这可能是我缺乏OOP知识的地方)这些切换和实现只是增加了复杂性,我看不到它的好处。

有人可以用ELI5或更多外行的方法来解释这一点吗?谢谢!

1 个答案:

答案 0 :(得分:1)

这就是TypeScript的亮点,并为JavaScript提供了一种更经典的面向对象编程方法。但首先,你需要知道你的SOLID principles,特别是在这种情况下,依赖性倒置原则(如toskv评论中所述),其中指出:

  • 高级模块不应依赖于低级模块。两者都应该依赖于抽象。
  • 抽象不应该依赖于细节。细节应该取决于抽象。

为了将其置于上下文中,接口用于描述对象执行给定任务所需的功能契约。

具体对象然后实现提供行为的接口。依赖关系应该通过接口而不是具体对象公开,因为这允许松散耦合并具有诸如可测试性之类的几个优点。