gpt4 book ai didi

c# - ServiceStack 服务可以包含多个方法吗?

转载 作者:可可西里 更新时间:2023-11-01 08:39:45 25 4
gpt4 key购买 nike

环境是 Visual Studio 2012、ServiceStack、ASP.NET Web 应用程序项目(遵循 https://github.com/ServiceStack/ServiceStack/wiki/Create-your-first-webservice )

查看 ServiceStack.Examples 中的一些类,我注意到大多数服务只包含一个方法。要么覆盖 Execute()或者,如果是 REST 服务,则重写 OnPost/Get/Put/Delete() .

如果我需要实现数十个函数,我应该如何制作完整的 API 集 RegisterUser() , RemoveUser() , AddFriend() , RemoveFriend() ...每种方法一项服务?

public RegisterUserService : IService<User> { public object Execute(User> dto) { ... } }
public RemoveUserService : IService<User> { public object Execute(User> dto) { ... } }
public AddFriendService : IService<Friend> { public object Execute(Friend dto) { ... } }
public RemoveFriendService: IService<RequestDTO4> { public object Execute(Friend dto) { ... } }

我完全不知道如何开始实现完整的 API 集。我读过 firstsecond关于“创建您的第一个网络服务”的维基页面,我已将其复制为 make 1 服务方法。但是现在我想制作 10 或 40 个服务方法,但我不确定该怎么做。

我注意到从 IRestService<T> 实现最多允许您使用 4 种方法,而不是一种 Execute()方法,只是因为每个方法对应于不同的 HTTP 动词。那么我可以写类似的东西吗?基本上是这样的:

public MyService : IService/IRestService/ServiceBase?<User>
{
public object AddUser(User user) { }
public object RemoveUser(User user) { }
public object ModifyUser(User user) { }
}

只是寻找不一定必须在一个服务类中包含所有方法,但尽可能多的东西......我真的必须为每个服务方法创建 1 个服务吗?

关于追求严格的 RESTful 架构的注意事项:我只阅读了一些关于 REST 的内容,但似乎我必须严格遵守以下规则:即使您必须重新设计模型,也要将所有内容视为资源, URL 名称中没有动词(/Friends,不是/GetFriends,因为 REST 为您提供了 OnGet()、OnPost()、OnPut() 和 OnDelete() ...实现几十个服务方法的方式。这是一个个人项目,所以需求不会有太大差异。

提前感谢您指导我完成这第一步。

编辑:刚看到这个相关问题:How to send commands using ServiceStack?

Mythz 说没有“ServiceStack 方式”来设计。这家伙的问题和我的差不多。我想知道如何在一个服务中堆叠很多服务方法。

编辑 2:刚看到 Need help on servicestack implementation , 和 Separate or combined ServiceStack services? .

我刚刚使用工作路线成功测试了以下代码:

[Route("/registerUser/setEmail/{Email}")]
[Route("/registerUser/setPassword/{Password}")]
[Route("/registerUser/setPhoneNumber/{PhoneNumber}")]
[Route("/lalal2395823")]
[Route("/test3234/test23423511")]
public class RegisterUser
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Nickname { get; set; }
public string PhoneNumber { get; set; }
public string Email { get; set; }
public string Password { get; set; }
}

但是我想要的是每个[Route("path")]转到不同的方法,而不是让它们全部在 Execute() 中解析并且必须解析哪个字符串不为 null 或为空。


我的解决方案

我决定采纳 Rickard 的建议并制作一个合适的 REST API,因为它最终看起来更简单、更清晰。

现在这是我的类(class)使用 the new ServiceStack API (new as of 9/24/12) :

using UserModel = Project.Model.Entities.User;

[Route("/User", "POST")]
[Route("/User/{FirstName}", "POST")]
[Route("/User/{FirstName}/{LastName}", "POST")]
[Route("/User/{FirstName}/{LastName}/{Nickname}", "POST")]
[Route("/User/{FirstName}/{LastName}/{Nickname}/{PhoneNumber}", "POST")]
[Route("/User/{FirstName}/{LastName}/{Nickname}/{PhoneNumber}/{Email}", "POST")]
public class CreateUser : IReturn<UserModel>
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Nickname { get; set; }
public string PhoneNumber { get; set; }
public string Email { get; set; }
public string Password { get; set; }
}

public class CreateUserService : Service
{
public object Post(CreateUser request)
{
try
{
using (var session = FluentNHibernateHelper.OpenSession())
{
using (var transaction = session.BeginTransaction())
{
var user = new UserModel()
{
FirstName = request.FirstName,
LastName = request.LastName,
Nickname = request.Nickname,
PhoneNumber = request.PhoneNumber,
Email = request.Email,
Password = request.Password,
};
session.SaveOrUpdate(user);
transaction.Commit();

return user;
}
}
}
catch
{
throw;
}
}
}

最佳答案

现在有了 ServiceStack's new API Design 就简单多了发布于 (v3.9.15+)。

@Rickard 就如何重构服务提出了很多要点,使其更加 REST-ful,现在使用 ServiceStack 的新 API 更容易实现,现在限制更少,更灵活,同一个服务可以处理多个不同的请求 DTO,您不再受限于可以返回的响应类型。

关于c# - ServiceStack 服务可以包含多个方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12549981/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com