在 ServiceStack Web 服务中设置公共属性

2024-01-09

我正在尝试使用 Sqlite 为 ServiceStack 服务编写单元测试。由于 Sqlite 不支持存储过程,因此我创建了“ServiceCommand”类型的公共属性,它将命令文本和命令类型作为输入。默认情况下,它配置为运行存储过程,并且在编写单元测试用例时,我在调用之前将 SelectCommand 属性重新分配给针对 sqlite 的 sql 查询Any()方法如下。所有测试用例都工作正常。

var request = new CustomerRequest() { name = "alfki"  };
var service = new CustomerService(InMemoryTestDatabase.OpenDbConnection());
service.SelectCommand = new ServiceCommand() { SQL = "SELECT * FROM customers where customerid = {0}" };
var result = service.Any(request);

但据此thread https://stackoverflow.com/questions/15745074/how-to-assign-default-value-to-a-property,在解析引用时,CustomerService 的公共属性被 IOC 设置为 null,因此 SelectCommand 为 nullAny()方法导致对象引用错误。通过将属性设置为受保护、私有、内部或静态,我将无法运行单元测试。

public class CustomerService : Service
{
  private readonly IDbConnection _dbConnection;
  public ServiceCommand SelectCommand {get;set;}

  public CustomerService(IDBConnection dbConnection)
  {        
         _dbConnection = dbConnection;  //injected successfully
         SelectCommand =  new ServiceCommand(){ SQL = "sp_getcustomers",
            CommandType = CommandType.StoredProcedure};          
  }

  public Customer Any(CustomerRequest request)
  {
        //Select command is not accessible here.

  }
}


[Route("/customers")]
public class CustomerRequest
{
    public string name { get; set; }
}

服务命令

public class ServiceCommand
{
    public string SQL { get; set; }        
    public CommandType CommandType { get; set; }

    public ServiceCommand()
    {
        CommandType = CommandType.Text;
    }
}

为了能够运行测试用例和服务,我进行了修改Any()如果 ServiceCommand 为 null,则实例化 ServiceCommand 的方法。我想知道这是否是可行的方法或有更好的选择。

public class CustomerService : Service
{
  private readonly IDbConnection _dbConnection; // injected successfully
  public ServiceCommand SelectCommand {get;set;}

  public CustomerService(IDBConnection dbConnection)
  {        
         _dbConnection = dbConnection;  //injected successfully         
  }

  public Customer Any(CustomerRequest request)
  {
        SelectCommand = SelectCommand ?? new ServiceCommand() { SQL = "sp_getCustomers",CommandType = CommandType.StoredProcedure };

  }
}

Since 服务栈 http://www.servicestack.net/services 将为所有公共属性注入已注册的 IOC 属性,它将覆盖您在构造函数中设置的值,因此如果未在 IOC 中注册,则无法将其设为公共属性,因为它将被覆盖为 null。

鉴于此,一些可能的选择是:

使其成为公共领域

public class CustomerService : Service
{
    public ServiceCommand SelectCommand = new ServiceCommand { 
       SQL = "sp_getcustomers", 
       CommandType = CommandType.StoredProcedure };
    ...
}

使用 setter 注入只读属性

service.SetSelectCommand(
  new ServiceCommand { SQL = "SELECT * FROM customers where customerid = {0}" });

在 IOC 中注册并在构造函数中指定

container.Register(new ServiceCommand { 
   SQL = "sp_getcustomers", 
   CommandType = CommandType.StoredProcedure });

并将构造函数更改为:

public CustomerService(IDBConnection dbConnection, ServiceCommand serviceCommand)
{        
    _dbConnection = dbConnection; 
    _serviceCommand = serviceCommand;    
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 ServiceStack Web 服务中设置公共属性 的相关文章

  • 将 C# 枚举定义序列化为 Json

    在 C 中给出以下内容 Flags public enum MyFlags None 0 First 1 lt lt 0 Second 1 lt lt 1 Third 1 lt lt 2 Fourth 1 lt lt 3 有没有现成的方法S
  • ServiceStack Swagger UI 和 API 版本号

    有没有办法将版本号输入到 swagger UI 中 那么我们可以让开发者知道每个部署是什么版本吗 这在最新版本的 ServiceStack 中是可能的 您只需在 AppHost 中设置 ServiceStack API 版本即可 publi
  • 如何在 ServiceStack 中进行身份验证后重定向

    我已经像这样重写了 CredentialsAuthProvider public override bool TryAuthenticate IServiceBase authService string userName string p
  • 关闭 ServiceStack 日志记录

    ServiceStack 的内部日志记录不是我希望在日志中包含的内容 我们如何禁用内部日志记录 或者至少抑制它 这样它就不会堵塞日志 配置 LogManager 时只需将其设置为 NullLogFactory 的实例 LogManager
  • ServiceStack 基准测试继续:为什么将简单(复杂)持久化为 JSON 会减慢 SELECT 速度?

    我想切换到 OrmLite 我需要弄清楚它是否很慢 如果是 原因是什么 在我的研究中 我得出的结论是 复杂的对象 在 OrmLite 中被 blob 为 JSON 是 SELECT 速度非常慢的罪魁祸首 因此 我创建了一个仅关注 OrmLi
  • ServiceStack路由设计

    这3条路线一样吗 通常首选哪一种 Route todo id DELETE Route todo delete POST Route todo delete id GET public class DeleteTodo IReturnVoi
  • 检查 SignalR 属性中的授权

    我在 ServiceStack 上有一些服务 并在这个项目中使用 SignalR 现在 我想保护集线器连接 仅对经过身份验证的用户进行访问 但我使用ServiceStack框架身份验证 不是asp net身份验证 和ServiceStack
  • AngularJs + ServiceStack 应用程序的安全性

    我有一个前端有四个模块的应用程序 我试图在前端尽可能多地使用 AngularJs 我正在使用一个空的网站 asp net 项目来托管所有文件和 REST serviceStack 我的项目具有以下结构 web config global a
  • 如何在 Servicestack 中隐藏 Swagger UI 的端点?

    我正在使用 ServiceStack 3 9 59 0 的 Swagger 插件 我的 ServiceStack API 中有一些端点 例如 selfchecknode 我不想在 Swagger UI 中显示它们 是否有一种声明性方式 也许
  • 如何计算请求到响应的生命周期?

    我目前正在向请求对象添加一个 cookie 并从响应中的当前时间中减去它 但我假设有更好的方法来做到这一点 此外 在实际用例中 重复使用相同的 Cookie 密钥可能行不通 有任何想法吗 RequestFilters Add request
  • ServiceStack Ormlite 和 RowVersion 支持

    在更新期间支持 sql server rowversion 的最简单方法是什么 我试过这个 db UpdateOnly u f gt new f Name f Description f Modified f ModifiedBy f gt
  • 当代码并非所有部分都是异步时,异步 Web 服务有什么好处

    我想知道如果代码并非所有部分都是异步的 那么使用异步 http 请求会带来多少好处 让我们考虑以下场景 1 异步 http 请求阻塞同步数据库调用 2 同步 http 请求等待异步数据库调用 1 Web Api 支持异步操作方法 但是如果我
  • 保持自托管服务堆栈服务作为 docker swarm 服务打开,而不使用控制台 readline 或 readkey

    我有一个使用 servicestack 用 C 编写的控制台应用程序 其形式如下 static void Main string args Some service setup code here Console ReadKey 这段代码在
  • System.IO.IOException:打开的文件太多

    在 Mac OS X 上调试 ServiceStack Web 应用程序时 我间歇性地收到此错误 我似乎无法确定它是什么 我尝试使用以下命令杀死 xamarin Web 服务器 ps aux grep xsp4 grep v grep aw
  • ServiceStack AppHost 是单例吗?

    我一直在评估 ServiceStack 到目前为止 我已经被说服了 但我有一个要求 think将会破坏交易 我基本上需要多个 AppHost 派生的实例 第一个运行良好 但其余的则失败 因为 AppHostBase Instance 已被设
  • PooledRedisClientManager 未释放连接

    我将 json 数据列表存储在 redis 中并使用 ServiceStack c 客户端访问它 我本质上是在管理自己的外键 我在其中存储zrangeid 我使用应用程序内部的接口从zrange然后从 Redis 获取底层 json 对象并
  • 将 RavenDB 与 ServiceStack 结合使用

    I read this http www philliphaydon com 2012 06 using nhibernate with servicestack Phillip Haydon 发表的有关如何将 NHibernate Rav
  • 用作 ServiceStack 的 IoC 时在 autofac 中配置生命周期范围

    我目前正在使用 AutoFac 作为我们的 ServiceStack Web 服务应用程序的 DI 容器 我能够配置接线和所有内容 但在阅读了有关范围的部分后 我不知道在注册我的组件时最好使用哪个范围 在我们的特定情况下 我认为 PerHt
  • 在 Servicestack 登录中禁用获取关键字

    当前在auth login中 您可以使用任何Get 如何限制某些内置服务的 GET 关键字 我们有一个渗透测试结果表明 不应通过 Get 关键字允许身份验证 登录 而只能通过 put 或 post 进行 如果您指的是 HTTP GET 请求
  • IdentityServer3 与 ServiceStack 和 MVC 客户端

    我是 IdentityServer3 的新手 刚刚开始设置它 似乎进展顺利 我一直在为 MVC 应用程序开发混合流程 类似于 Kevin Dockx 的 Pluralsight 课程中所示的内容 http www pluralsight c

随机推荐