Разные версии xsd
От: varenikAA  
Дата: 28.04.20 04:14
Оценка:
Есть две версии xsd очень похожей структуры.
Классы сгенерил в разные пространства имен.
Логика абсолютно одинакова, по крайней мере пока.
Но так как типы конкретные при десериализации не могу повторно заюзать логику.
Нельзя ли избежать дублирования по принципу DRY?
Понятно, что формально типы разные, но всё же.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: Разные версии xsd
От: Mihas  
Дата: 28.04.20 06:42
Оценка:
Здравствуйте, varenikAA, Вы писали:

AA>Но так как типы конкретные при десериализации не могу повторно заюзать логику.

AA>Нельзя ли избежать дублирования по принципу DRY?
Если я правильно помню, то один xsd может быть наследником второго. Но в подробности надо вникать.
Re: Разные версии xsd
От: RushDevion Россия  
Дата: 28.04.20 06:52
Оценка:
Выделить общую часть (необходимую для generic-обработки) в интерфейс, сгенерить классы как partial, добавить partial файлы с определением интерфейса для каждого из типов.

Ещё вариант — генерить и сам код обработки.
Например в виде extensions к типам. Тогда общая часть логики обработки будет в генераторе (без дублирования).
Отредактировано 28.04.2020 7:00 RushDevion . Предыдущая версия .
Re[2]: Разные версии xsd
От: varenikAA  
Дата: 28.04.20 08:01
Оценка:
Здравствуйте, Mihas, Вы писали:

M>Здравствуйте, varenikAA, Вы писали:


AA>>Но так как типы конкретные при десериализации не могу повторно заюзать логику.

AA>>Нельзя ли избежать дублирования по принципу DRY?
M>Если я правильно помню, то один xsd может быть наследником второго. Но в подробности надо вникать.
Интересно, не смог найти к сожалению руководства.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[2]: Разные версии xsd
От: varenikAA  
Дата: 28.04.20 08:05
Оценка:
Здравствуйте, RushDevion, Вы писали:

RD>Выделить общую часть (необходимую для generic-обработки) в интерфейс, сгенерить классы как partial, добавить partial файлы с определением интерфейса для каждого из типов.


RD>Ещё вариант — генерить и сам код обработки.

RD>Например в виде extensions к типам. Тогда общая часть логики обработки будет в генераторе (без дублирования).

C# не особо дружит с макросами, хоть в коре и появилась , но боюсь я такой путь не осилю. не хочется нарушать принцип KISS.
Есть подозрение, что в новой версии лишь добавлены плюсом новые типы документов, но для проверки все равно нужно что-то писать.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[3]: Разные версии xsd
От: RushDevion Россия  
Дата: 28.04.20 08:21
Оценка:
AA>C# не особо дружит с макросами, хоть в коре и появилась , но боюсь я такой путь не осилю. не хочется нарушать принцип KISS.

Я не про аспекты говорил, а про что-то типа такого.

IDocument.cs
public interface IDocument {
  string Number {get; set;}
  string Title  {get; set;}
  string Description {get; set;}
  string[] Notes { get; set;}
}


GenericProcessor.cs
public class GenericProcessor.cs {
  void Process(IDocument document) { ... }
}


Generated1.cs — сгенерированный код
partial class Generated1 { ... }


Generated1.partial.cs — добавляем руками
partial class Generated1 : IDocument { }


Generated2.cs — сгенерированный код
partial class Generated2 { ... }


Generated2.partial.cs — добавляем руками
partial class Generated2 : IDocument { }
Re[3]: Разные версии xsd
От: Mihas  
Дата: 28.04.20 08:29
Оценка: 6 (1)
Здравствуйте, varenikAA, Вы писали:

M>>Если я правильно помню, то один xsd может быть наследником второго. Но в подробности надо вникать.

AA>Интересно, не смог найти к сожалению руководства.

Ройся тут https://www.w3.org/TR/xmlschema11-1/
В пункте 3.3.2.5 есть пример c extension. Где-то он должен быть описан. Это штатная вещь и C# ее поддерживает.
<xs:complexType name="facet">
  <xs:complexContent>
   <xs:extension base="xs:annotated">
    <xs:attribute name="value" use="required"/>
   </xs:extension>
  </xs:complexContent>
 </xs:complexType>


На эту же тему есть еще инструкция restrict.
Re: Разные версии xsd
От: Mr.Delphist  
Дата: 28.04.20 13:27
Оценка:
Здравствуйте, varenikAA, Вы писали:

AA>Есть две версии xsd очень похожей структуры.

AA>Классы сгенерил в разные пространства имен.
AA>Логика абсолютно одинакова, по крайней мере пока.
AA>Но так как типы конкретные при десериализации не могу повторно заюзать логику.
AA>Нельзя ли избежать дублирования по принципу DRY?
AA>Понятно, что формально типы разные, но всё же.

Вынести общую часть в третью схему, затем включить её в превую и вторую.
https://stackoverflow.com/questions/2357943/whats-the-difference-between-xsdinclude-and-xsdimport
Re: Разные версии xsd
От: varenikAA  
Дата: 29.04.20 08:01
Оценка:
Здравствуйте, varenikAA, Вы писали:

AA>Есть две версии xsd очень похожей структуры.

AA>Классы сгенерил в разные пространства имен.
AA>Логика абсолютно одинакова, по крайней мере пока.
AA>Но так как типы конкретные при десериализации не могу повторно заюзать логику.
AA>Нельзя ли избежать дублирования по принципу DRY?
AA>Понятно, что формально типы разные, но всё же.

Вообщем, извратился, т.к. новая версия(2.3) расширяет старую(2.2), сделал так:
    public static class XmlExt
    {
        public static void DeleteNamespaces(this XElement el)
        {
            el.Attributes().Where(a => a.IsNamespaceDeclaration).Remove();
            el.Name = el.Name.LocalName;
            if (!el.HasElements)
                return;

            foreach (XElement d in el.Elements())
                DeleteNamespaces(d);
        }
    }

....
        private static void PrepareDocument(string path, MemoryStream stream)
        {
            XNamespace ns = "http://types/2.3";
            var doc = XDocument.Load(path);
            doc.Root.DeleteNamespaces();
            var sb = new StringBuilder();
            var writer = XmlWriter.Create(sb);
            doc.Save(writer);
            writer.Flush();
            var xdoc = new XmlDocument();
            xdoc.LoadXml(sb.ToString());
            xdoc.DocumentElement.SetAttribute("xmlns", ns.NamespaceName);
            xdoc.Save(stream);
            stream.Flush();
            stream.Position = 0;
        }
....
☭ ✊ В мире нет ничего, кроме движущейся материи.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.