我使用它Angular 4作为我的前端框架,基本上只是asp net core作为客户端获取数据并偶尔发布数据的 API。
我正在制作一个仪表板来显示一些统计数据。我在数据库中拥有的数据不能直接用于此仪表板,因为它需要转换和进一步处理。我不会将模型实体返回给 API,而是将其View Model与删除了一些 id 等的模型实体基本相同。
我现在所拥有的是,我的 AngularDashboardComponent正在使用 aDataService来构造一个HTTP GET指向我已经存在的 API 端点的请求GetOrders。这将从数据库中获取所有订单并将其返回到DataService最终DashboardComponent,然后需要提取数据并进行大量处理和转换,以便准备好提供数据Google Charts并生成有意义的图表。然后,用户可以选择在仪表板上查看另一个图表,仅拥有该图表是不够的Orders,还必须从数据库中检索另一个实体,因此使用不同的端点重复上述 API 调用。
我的问题归结为:
一般来说,我正在寻找一些关于此的设计模式或只是最佳实践,但还没有真正找到一些东西。
design-patterns api-design transformation server-side client-side
我们使用 Hapi 作为 API 框架,并将与持久存储后端(mongo 通过 mongoose)相关的所有内容放在插件中。现在我想知道如何最好地将不同集合(用户、通知、购买等)的所有 CRUD 方法公开给我们的其他 API 插件。
我知道server.expose并且server.method(这只是server.expose缓存吗?)并且只是无法决定在这种情况下我应该选择哪个。你能推荐一下吗?
非常感激!
haystack这两个非常核心的 PHP 函数中的参数顺序needle并不一致:
为什么会这样呢?
我有一个当前结构为这样的库:
class Base<T>
{
}
class Derived : Base<int>
{
public int Foo();
}
class AnotherDerived : Base<string>
{
}
Run Code Online (Sandbox Code Playgroud)
我想类似的添加Foo(),以AnotherDerived和为实现将是相同的两个,我想拉起Foo()到他们共享的父类Base像下面。
class Base<T>
{
public T Foo();
}
class Derived : Base<int>
{
}
class AnotherDerived : Base<string>
{
}
Run Code Online (Sandbox Code Playgroud)
否则会改变返回类型Foo()从int到T。更改成员的返回类型被列为重大更改。但是既然Derived是泛型的Base<T>,T=int代码还是可以编译的,至少对于这个例子是这样。
int foo = myDerived.Foo();
Run Code Online (Sandbox Code Playgroud)
我不想向我的用户介绍重大更改,所以我的问题是这种拉起是否以任何方式被视为重大更改?进入基地本身不应该是一个突破性的变化
将方法移到其被移除类型的层次结构树中更高的类上
启用代码共享并且不应该是破坏性更改的替代实现,但如果上拉是非破坏性的,我想避免这种实现,可能是:
class Base<T>
{
protected T Foo();
}
class Derived …Run Code Online (Sandbox Code Playgroud) 我真的有两个问题:
1)什么时候使用包私有接口?
2)有没有办法让一个公共接口关闭以便在其包外实现?
我在大约12岁的开发团队工作,我们构建了一套合理的API,我们仅在内部严格使用.通常,所有类和接口都是公共的,因为这就是它们的完成方式.我经常考虑将一些构造函数设置为内部的价值,以便API的消费者(尽管是内部的)必须使用工厂或我现在想不到的其他一些原因.
这是你和你的团队练习的东西吗?
这对您的单元测试有何影响?你是否发现通过它的工厂对一个类进行单元测试是可以的,还是通过像PrivateObject这样的东西来访问构造函数?
我正在编写一个实用程序库,它由几个"包"组成.每个包中的类都包含在各种名称空间中.我已经知道如何通过在类声明结束时自动声明使用语句来简化情况(见下文),这将避免程序员在cpp文件中执行此操作.
namespace Utility
{
class String
{
// Class Implementation
};
}
using Utility::String;
Run Code Online (Sandbox Code Playgroud)
我的理解是,如果用户包含头String.h并且String在Utility中,那么程序员将希望使用String.显然,如果有外部类链包括一堆污染命名空间的文件,那么这可能会很糟糕,所以我想到如何将它变成#define.
namespace Utility
{
class String
{
// Class Implementation
};
}
#ifdef AUTO_DECLARE_NAMESPACE
using Utility::String;
#endif
Run Code Online (Sandbox Code Playgroud)
这样,想要这种扩展功能的程序员可以获得它.
这是一个好主意还是有什么我忽略的?
我有一个参数化类型,我想约束到一个数字类型,更具体地说是一个Fractional,例如:
data Rating a = (Fractional a) => Score a | Unscored deriving (Show, Eq)
Run Code Online (Sandbox Code Playgroud)
这样API的用户可以定义他们可能使用哪种非整数类型(Float或Double?),但我写的内部API代码仍然可以对数字类型执行算术运算.我不希望它是一个整数,因为我的"内部操作"的结果可能不是整数,我的理解是使用Fractional会导致更准确的结果.
编译上面(至少在GHCI中)给出了以下错误:
Data constructor `Score' has existential type variables, a context, or a specialised result type
Score :: forall a. Fractional a => a -> Rating a
(Use ExistentialQuantification or GADTs to allow this)
In the definition of data constructor `Score'
In the data declaration for `Rating'
Run Code Online (Sandbox Code Playgroud)
这告诉我,我正在做一些我可能不想继续尝试的事情; 即我的设计是垃圾.
我想我试图在这个API中说出以下内容:"当你使用Rating类型时,它的参数必须是一个子类,Fractional所以我可以对它执行准确的算术".我怎么能实现这个目标?还是我离开了标记和/或过度工程?
我试图围绕如何(以及是否要)在我的api中实现HATEOAS进行研究。我喜欢这样一种概念:仅向客户提供在当前情况下适当的操作。但是我不确定我是否正确实现了这个想法。
假设我有一个资源类型订单,其状态可以更改,它可以具有不同的状态(处理中,接受,拒绝,过期,成功)。然后,我应该创建以下json对象:
{
...
"links": {
"accept": "http://example.com/order/1/accept",
"decline": "http://example.com/order/1/decline"
}
}
Run Code Online (Sandbox Code Playgroud)
还是我在这里创建不必要的动作?如果以上正确,是否应通过PATCH或GET更改状态?如果是PATCH,一个人怎么会知道(打败了超媒体的目的)?
编辑:忘记添加订单ID
我注意到,Microsoft Graph API经常$ref在URI中使用。
例如,可以使用以下HTTP请求将成员添加到Office 365组:
POST /groups/{id}/members/$ref
Run Code Online (Sandbox Code Playgroud)
为什么$ref使用后缀?这是否提供任何价值或优势?在这种情况下,这是否有特殊含义?
api-design ×10
api ×2
c# ×2
rest ×2
c++ ×1
client-side ×1
hapi.js ×1
haskell ×1
hateoas ×1
hypermedia ×1
internal ×1
java ×1
javascript ×1
json-api ×1
namespaces ×1
node.js ×1
oop ×1
php ×1
protected ×1
server-side ×1
types ×1