Как получить вложенный элемент с помощью ServiceStack?

Хотя я могу получить доступ к SchemaVersion с помощью приведенного ниже кода, я не могу получить доступ к вложенному элементу FormatDocID.

Любые идеи, как я могу легко получить FormatDocID, используя ServiceStack и AutoQueryFeature (или аналогичные)?

Я помещаю только соответствующие части кода здесь

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";
}

Заранее спасибо за ответы.

1 ответ

Непонятно, чего вы пытаетесь достичь или почему, AutoQuery создает Auto Queryable API, где Response является ответом API, сериализованным в указанном типе содержимого Response.

Если вы хотите перехватить DTO Typed Response до его возвращения, вы можете создать собственную реализацию AutoQuery и проанализировать ответ таким образом, например:

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 позволяет вам предоставлять собственную коллекцию Typed POCO в качестве источника данных, поэтому у вас уже есть доступ к ним при его создании, но POCO источника должен быть плоского типа с открытыми свойствами (в отличие от них). в ваш класс с открытыми полями и вложенными типами) - невозможно запросить значения графа вложенного объекта.

Это пример POCO, который не использует вложенные классы или открытые поля:

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

Таким образом, решение, если вы хотите использовать AutoQuery, состоит в том, чтобы изменить ваш источник данных для использования плоских POCO с открытыми свойствами, в противном случае вам нужно будет создать значение вашей службы самостоятельно.

Другие вопросы по тегам