Как получить вложенный элемент с помощью 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 с открытыми свойствами, в противном случае вам нужно будет создать значение вашей службы самостоятельно.