我真的很想利用servicestack来提供我需要编写的服务,但是我正在思考如何运用它来解决我的想法,更确切地说,我如何能够使它适用于我的意图和目的。我没有强大的asp背景,主要是后端,所以也许这就是精神障碍的原因。
我有一个遗留平台,我通过本机c ++ api连接。我已经将cli中的原生api变成了.net类库,这将是我在样本中注入的Todo repo的等价物。
来回移动的数据在类lib中作为值结构公开。例如,帐户将定义如下:
struct Account{
int id;
string name;
string password;
...
}
订单会是这样的:
struct Order{
int orderId;
int account;
string comment;
...
}
lib为与上述类似定义的各种不同对象公开了许多功能和操作。我想要了解的是:
1)如何在容器中注册api?更准确地说,我不明白Register方法如何知道它应该得到什么类型。在todo示例中,所有内容都在同一个程序集中定义,因此很难看到后端是如何注入的。
2)有没有办法在框架中管理后端的生命周期。我可以在所有连接中将其设为单例。
3)我是否必须将我的结构包装在将字段映射到请求的类中。关于如何定义请求对象并不清楚,似乎请求的内容应该是转换为操作的fieldname / type的url的字段。如果有一种方法不必包装,我该如何限制在api中显示哪些字段以及哪些不显示。
4)我是否绝对必须为每种数据类型创建一个服务,所以在上面的结构中我必须为Orders实现一个服务,而一个用于Accounts的服务是否有办法将它们合并为一个。我喜欢ss可以转换为mq的谈话,将联合服务使得将来难以在mq上运行,这种方法的缺点是什么。
5)最后,我想公开api中的操作,afaik会违反其余的合同。类似的东西:存档帐户较旧....这将是一个返回成功/失败状态没有更新/删除等的操作。实质上,通过http请求驱动一些功能。这是否可能在ss中,如果是这样,以这种方式使用它会对框架的操作产生任何破坏性后果...
答案 0 :(得分:2)
1)要注册您的API,您需要使用内置的IoC和Funq。
container.Register(c => new LegacyApiService())
.ReusedWithin(ReuseScope.Container);
Funq能够在您的API服务中自动连接这些服务。看看https://github.com/ServiceStack/ServiceStack/wiki/The-IoC-container。
您还可以使用TryResolve方法解决任何容器可用的问题。
2)您可以通过在注册时指定ReuseScopes来使用Funq控制对象生存期。你会想看看
ReuseScope.Container: Singleton scope
// a instance is used per application lifetime
3)您将需要为结构创建计划旧类(DTO)。这对ServiceStack来说是必要的。您的所有DTO公共属性都将被序列化。您还可以选择使用DataMemberAttribute和IgnoreDataMemberAttribute来控制要序列化的公共属性。
4)您需要为每个请求DTO提供一个服务。但是,您可以将此代码保留为最小值并调用集中式业务层。这是必要的,因为每个路由+动词需要具有不同的操作,因此每个DTO有一个服务类。
5)您可以轻松定义更多路由,并且没有任何东西会强制您遵守REST规则,您可以根据需要自由实施HTTP动词。您可以轻松地在执行诸如归档等操作的GET上创建专用路由。这里没有令人衰弱的后果,可能只是混淆了你的API消费者。请确保每个人都清楚API如何与文档一起使用。