【问题标题】:Accessing ServiceStack requestDto object by type按类型访问 ServiceStack requestDto 对象
【发布时间】:2013-11-01 09:10:18
【问题描述】:

我正在使用一个 ServiceStack 请求过滤器,我想检查 requestDTO 参数的属性之一。此参数在运行时是强类型,但在编译时是一个泛型对象。

过滤器将用于多个服务调用,因此 requestDTO 类型将根据调用的不同而改变。因此,我无法对其执行特定的演员表。但是,无论类型如何,requestDTO 对象都将始终具有一个名为“AppID”的字符串属性。我希望访问的正是这个属性。

这是我的代码(目前无法编译):

 public override void Execute(ServiceStack.ServiceHost.IHttpRequest req, ServiceStack.ServiceHost.IHttpResponse res, object requestDto)
        {
            //Check only for non-local requests
            if (!req.IsLocal)
            {                
                var app = this._appIDs.Apps.Where(x => x.ID == requestDto.AppID).FirstOrDefault();

                var errResponse = DtoUtils.CreateErrorResponse("401", "Unauthorised", null);
                var contentType = req.ResponseContentType;
                res.WriteToResponse(req, errResponse);
                res.EndRequest(); //stops further execution of this request
                return;
            }
        }

此行无法编译:

 var app = this._appIDs.Apps.Where(x => x.ID == requestDto.AppID).FirstOrDefault();

我是否需要在此处处理反射才能访问我的对象,还是 ServiceStack 本身内置了某种方法?

【问题讨论】:

    标签: c# servicestack


    【解决方案1】:

    将通用功能应用于常见请求 DTO 时的首选方法是让它们实现相同的接口,例如:

    public interface IHasAppId
    {
        public string AppId { get; set; }
    }
    
    public class RequestDto1 : IHasAppId { ... }
    public class RequestDto2 : IHasAppId { ... }
    

    然后在你的过滤器中你可以这样做:

    var hasAppId = requestDto as IHasAppId;
    if (hasAppId != null)
    {
        //do something with hasAppId.AppId
        ...
    }
    

    你也可以避免使用接口而使用反射,但这会更慢且可读性较差,所以我推荐使用接口。

    【讨论】:

    • 加格,当然。他们已经实现了适当的接口,我很愚蠢。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2014-01-07
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    • 2013-08-24
    • 1970-01-01
    • 2014-10-03
    • 1970-01-01
    相关资源
    最近更新 更多