How to organize my code
I have an auto generated class file with many partial classes (auto generated from an xsd schema). I use VS2010 and VB.NET. I want to create objects of all of the partial classes like this
Dim schema_obj As Schema
schema_obj = New Schema
schema_obj.Info = New Info
schema_obj.Info.Number = New Number
schema_obj.Info.Number.Value = 3
For all the properties in the different classes (like ex.
schema_obj.Info.Number.Value
schema_obj.Info.Birthday.Value
schema_obj.Info.Colour
I have to write
schema_obj.Info.Number = New Number
schema_obj.Info.Birthday = New Birtday
schema_obj.Info.Colourr = New Colour
I have one function that creates all of these objects and this way I fill the schema object with data.
What is the best way to organize my code? And what about dependency injection? Where should I put my function? In the business layer?
Thanks in advance
UPDATE:
Thanks for all comments and your complementary answer! I appreciate it very much! I’m developing a part of and business application. The application is used for registration of persons data, invoicing, accounting, and so on. The part I’m developing is a reporting system to the authority via wcf services. In my part I will use VB.NET but the other parts of the system are developed in VB6. We use an SQL server and nearly all the business logic is located at the server side. Because I’m used to use VB6 its difficult to grasp all the OOP things I need to remember to write the code as it should be. In my part of the application I get an xsd schema from the authority and auto generate my schema class file from the xsd file with xsd.exe. I see that it’s a much better solution that you suggest, but when I looked at my auto generated class file after reading your answer I see that every partial class has a MyBase = New line in the constructor. I can use this in a way, like you suggest? Sorry for not understanding this earlier! If I understand the behavior of MyBase correct, I can write
Dim Number = New Number
Number.value = 3
and the Number constructor will call the Info constructor an the Info constructor will call the Schema constructor. And I can write
Dim PersonName = New PersonName
PersonName.Value = Bob
Dim PersonAdress = New PersonAdress
PersonAdress.Value = New York
Instead of
schema_obj.Info.Person.PersonName = New PersonName
schema_obj.Info.Person.PersonName.value = Bob
But still I have to create many objects in my function. How can I do this in a better way?
And in the end of my function I want to parse the schema object to a memory stream. I do that like this: Dim memorystream As New System.IO.MemoryStream Dim ser As New XmlSerializer(GetType(Schema))
ser.Serialize(memorystream, Schema_obj)
But now I do not have a Schema_obj that holds the information, how can I parse the schema_obj (all the information) to a memorystream?
UPDATE 2
Sorry, now I understand (I think) and I have done as you said and I can write
Schema_obj = New Schema
Schema_obj.Info.Number.Value = 3
Schema_obj.Info.Person.PersonName = New PersonName
Schema_obj.Info.Person.PersonName.value = Bob
And I do not have to create the objects in my function. But instead of adding my own constructors the MyBase takes care of the job? And now I also can serialize my schema_obj.
But is it possible for you to say anything more about how I can solve the problem with Schema_obj.Info.Number.Value = 3 The project I doing is a fest step against vb.net and OOP for my business. I can use entity framework for my data layer, and I can have my business logic in a Business layer. My front end will be in vb6.
UPDATE 3
Now I’m back to being a little bit confused. I thought I got it but I do not… when I try to run my application I get the error: Object reference not set to an instance of an object. It seems like I have to write
Dim schema_obj As Schema
schema_obj = New Schema
schema_obj.Info = New Info
schema_obj.Info.Number = New Number
schema_obj.Info.Number.Value = 3
The MyBase did not do what I thought it did? Can you please explain some more? Thank you!
UPDATE 4
Thanks for your reply.
- Take an XML Schema and have VB.NET classes generated from it.
- Build objects and fill in some data (property values).
- Serialize everything back to XML.
This is exactly what I do. But I thought I had to convert the xsd to a class, build objects and fill the objects with data and then serialize it back to xml. Why is it a better solution to go for what you suggest? I’m new to this so I appreciate your answers. Do you have an example of when it it a good solution to convert the xsd to objects, like I have done? The xsd I use will change once a year, is it easier to adapt my code to the changes in the way you suggest? The xsd schema is more complex than I showed in my example, I do not know if that have anything to say regarding what method I have to choose?
UPDATE 5:
I’m developing an application where I use wcf services . I use the web service the organization offer to:
1.Send an xml schema populated with data 2.Get a list of available web services 3.Get a specific xsd schema
What I have to do is:
1.Get a xsd schema form the authority and use this xsd to generate a xml populated with data 2.Call the webservice where I can specify a number for a specific xsd schema , and get the xsd schema in return. Then I can validate my xml schema against it before I send it to the authority
3.Use a web service where my xml string is in a string property of a method of the wcf service and I send the xml file to the authority
My xsd looks (almost) like this:
<?xml version="1.0" encoding="iso-8859-1"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:br="http://www.br.se/or" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!--title='Tittle' lang='E'-->
<xs:element name="Schema">
<xs:annotation>
<xs:documentation>
<br:txt br:lang="E" br:txttype="LEDE">
<p>Some text</p>
</br:txt>
</xs:documentation>
<xs:documentation>
…………………………
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" ref="Information"/>
<xs:element minOccurs="0" ref="Payer"/>
</xs:sequence>
<xs:attribute fixed="105" name="numberr" type="xs:integer" use="required"/>
<xs:attribute fixed="10360" name="externalnumberr" type="xs:integer" use="required"/>
<xs:attribute fixed="Title" name="title" type="xs:string" use="optional"/>
<xs:attribute fixed="4895" name="groupid" type="xs:positiveInteger" use="optional"/>
<xs:attribute name="id" use="optional">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="761065">
<xs:annotation>
<xs:documentation>Text</xs:documentation>
</xs:annotation>
</xs:enumeration>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:anyAttribute/>
</xs:complexType>
</xs:element>
<xs:element name="Info">
<xs:annotation>
<xs:documentation>
<br:txt br:lang="E" br:txttype="LEDE">
<p>Some Text</p>
</br:txt>
</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element ref="Task">
<xs:annotation>
<xs:documentation>
<br:txt br:lang="E" br:txttype="LEDE">
<p>Some text</p>
</br:txt>
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element ref="Year">
<xs:annotation>
<xs:documentation>
<br:txt br:lang="E" br:txttype="LEDE">
<p>Some Text</p>
</br:txt>
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" ref="Taskowner"/>
</xs:sequence>
<xs:attribute fixed="4877" name="id" type="xs:positiveInteger" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="TaskSpesialTask">
<xs:annotation>
<xs:documentation>
<br:info br:type="some txt">1</br:info>
</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:simpleContent>
<xs:extension base="List1">
<xs:attribute fixed="212" name="schemaid" type="xs:positiveInteger" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:simpleType name="List2">
<xs:annotation>
<xs:documentation>
<br:info br:type="id">2</br:info>
</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:length value="1"/>
<xs:enumeration value="1">
<xs:annotation>
<xs:documentation>
<br:txt br:lang="E" br:txttype="LEDE">
<p>Some text</p>
</br:txt>
</xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="2">
<xs:annotation>
<xs:documentation>
<br:txt br:lang="E" br:txttype="LEDE">
<p>Some text</p>
</br:txt>
</xs:documentation>
</xs:annotation>
</xs:enumeration>
</xs:restriction>
</xs:simpleType>
<xs:element name="Year">
<xs:annotation>
<xs:documentation>
<br:info br:type="pl">2</br:info>
</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:simpleContent>
<xs:extension base="Format">
<xs:attribute fixed="692" name="schemaid" type="xs:positiveInteger" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:simpleType name="Format">
<xs:annotation>
<xs:documentation>
<br:info br:type="id">6</br:info>
</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:gYear"/>
</xs:simpleType>
<xs:element name="TaskOwner">
<xs:annotation>
<xs:documentation>
<br:txt br:lang="E" br:txttype="LEDE">
<p>Some Text</p>
</br:txt>
</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element ref="TaskoOwnerNumber">
<xs:annotation>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" ref="TaskOwnerName">
<xs:annotation>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" ref="TaskOwnerAdress
<xs:annotation>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" ref="TaskOwnerPhone">
<xs:annotation>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" ref="TaskOwnerEmail">
<xs:annotation>
</xs:annotation>
</xs:element>
</xs:sequence>
<xs:attribute fixed="48" name="id" type="xs:positiveInteger" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="TaskOwnerNumber">
<xs:annotation>
</xs:annotation>
<xs:complexType>
<xs:simpleContent>
<xs:extension base="TextFormat">
<xs:attribute fixed="21" name="id" type="xs:positiveInteger" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:simpleType name="TextFormat">
<xs:annotation>
<xs:documentation>
<br:info br:type="id">1</br:info>
</xs:documentation>
<xs:documentation>
<br:txt br:lang="E" br:txttype="F">
<p>Wrong number</p>
</brreg:tekst>
</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:length value="9"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="TaskOwner name">
<xs:annotation>
</xs:annotation>
<xs:complexType>
<xs:simpleContent>
<xs:extension base="TextFormat">
<xs:attribute fixed="2" name="id" type="xs:positiveInteger" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="TaskOwner Adress">
<xs:annotation>
</xs:annotation>
</xs:element>
And so on for phone and email
<xs:element name="Payers">
<xs:annotation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="20000" minOccurs="0" ref="PayersInfo"/>
<xs:element minOccurs="0" ref="PaymentTotal">
<xs:annotation>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" ref="NumberOfPayers">
<xs:annotation>
</xs:annotation>
</xs:element>
</xs:sequence>
<xs:attribute fixed="410" name="id" type="xs:positiveInteger" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="PayersInfo">
<xs:annotation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" ref="PayerBirthNumber">
<xs:annotation>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" ref="PayerNumber">
<xs:annotation>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" ref="PayerBirthDay">
<xs:annotation>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" ref="PayerName">
<xs:annotation>
</xs:annotation>
</xs:element>
&开发者_Python百科lt;xs:element minOccurs="0" ref="PayerAdress">
<xs:annotation>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" ref="PayerPhone">
<xs:annotation>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" ref="PayerEmail">
<xs:annotation>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" ref="PayerSum">
<xs:annotation>
</xs:annotation>
</xs:element>
</xs:sequence>
<xs:attribute fixed="48" name="id" type="xs:positiveInteger" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="PayerBirthNumber">
<xs:annotation>
</xs:annotation>
<xs:complexType>
<xs:simpleContent>
<xs:extension base="TextFormat">
<xs:attribute fixed="2305" name="id" type="xs:positiveInteger" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:simpleType name="TextFormat">
<xs:annotation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:length value="11"/>
</xs:restriction>
</xs:simpleType>
And som on for PayerNumber, PayerBirthDay, PAYerNAMe, PayerAdress, PayerPhone, PayerEmail…..
</xs:schema>
The elements in the xsd are structured as this:
Schema
Info
Year
TaskOwner
TaskOwnerName
TaskOwnerAdress
TaskOwnerPhone
TaskOwnerEmail
TaskOwnerNumber
Task
TaskSpecialTask
TaskOrdinaryTask
Payers
PaymentTotal
NumberOfPayers
PayersInfo (list of payers)
PayerBirtNumber
PayerBirthDay
PayerName
PayerAdress
PayerPhone
PayerEmail
(Pleas ignore if something is left out in the xsd - it is there just so I can explain my problem better)
My question is, how should I generate the xml based on the xsd? I want to do this for multiple xsd schemas. Isn't it the a good solution to deserialize the xsd (with xsd.exe) to a class, create object of that class and populate it with data, and then serialize the object back to xml? Or is it still better the way you suggest. I really want to learn and do it the best way, and not do it the easiest way for me.. I hope this makes it easier for you to give me an answer.
Thanks!
精彩评论