1

虽然我可以使用下面的代码访问 SchemaVersion,但我无法访问 FormatDocID 嵌套元素。

任何想法如何使用 ServiceStack 和 AutoQueryFeature (或类似)轻松获取 FormatDocID ?

我在这里只放了相关的代码部分

public override void Configure(Container container)
{
    JsConfig.DateHandler = DateHandler.ISO8601;
    SetupValidators(container);
    SetupIOC(container);
    SetupPlugins(container, log);
    ContentTypes.Register("application/xml"
    , CLXmlSerializer.Serialize, ServiceStack.Text.XmlSerializer.DeserializeFromStream);
    SetupMetaDataRedirectionPath();
    SetupGlobalResponseFilters();
}

设置插件

private void SetupPlugins(Container container)
{
    Plugins.Add(new ValidationFeature());
    Plugins.Add(new SwaggerFeature());
    Plugins.Add(new AutoQueryFeature
    {
        MaxLimit = 1000,
        EnableUntypedQueries = false,
        IncludeTotal = true
    });

    Plugins.Add(new AutoQueryDataFeature {MaxLimit = 100}
        .AddDataSource(ctx => ctx.MemorySource(new List<WordDocument>
        {
            new WordDocument()
            {
                SchemaVersion = "",
                Format = new Word.DocumentFormat()
                {
                    FormatDocID = 254
                }
            }
        }))
        );

    typeof(RequestLogs).AddAttributes(new RestrictAttribute {VisibilityTo = RequestAttributes.None});
    typeof(AssignRoles).AddAttributes(new RestrictAttribute {VisibilityTo = RequestAttributes.None});
    typeof(UnAssignRoles).AddAttributes(new RestrictAttribute {VisibilityTo = RequestAttributes.None});
    typeof(Authenticate).AddAttributes(new RestrictAttribute {VisibilityTo = RequestAttributes.None});
}

可序列化的类

public abstract class Document
    {
        public DocumentFormat Format;

        public class DocumentFormat
        {
            [XmlAttribute] public int Version;

            public int FormatDocID;
            public string DocShortName;
        }
    }


public class WordDocument : Document
{
    [XmlAttribute] public string SchemaVersion { get; set; } = "1.0";
}

提前感谢您的答案。

4

1 回答 1

1

目前尚不清楚您要实现什么或为什么,AutoQuery创建 Auto Queryable API,其中响应是在指定的响应内容类型中序列化的 API 响应。

如果您想在返回之前拦截 Typed Response DTO,您可以创建自定义自动查询实现并以这种方式内省响应,例如:

public class MyQueryServices : Service
{
    public IAutoQueryData AutoQuery { get; set; }

    //Override with custom implementation
    public object Any(MyQuery query)
    {
        var q = AutoQuery.CreateQuery(query, base.Request);
        var response = AutoQuery.Execute(query, q);
        return response;
    }
}

但是您使用的AutoQuery Memory Data Source允许您提供自己的类型化 POCO 集合作为数据源,因此您在创建它时已经可以访问它们,但是源 POCO 应该是具有公共属性的平面类型(相比之下到具有公共字段和嵌套类型的类) - 无法查询嵌套对象图值。

这是一个不使用嵌套类或公共字段的 POCO 示例:

public abstract class Document
{
    public int Version { get; set; }
    public int FormatDocID { get; set; }
    public string DocShortName { get; set; }
}

因此,如果您想使用 AutoQuery,解决方案是将您的数据源更改为使用具有公共属性的平面 POCO,否则您需要自己创建服务的 impl。

于 2019-02-25T21:22:53.287 回答