开发者

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.

  1. Take an XML Schema and have VB.NET classes generated from it.
  2. Build objects and fill in some data (property values).
  3. 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!

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜