Guest dkode Posted June 25, 2003 Posted June 25, 2003 I am laying out a static class diagram and a use case diagram in Visio for a new application I am making Now, I am having a very difficult time getting UML and object oriented ideas through my head. I began by making a DataAccess class with some basic methods like so: GetDS(ByVal sql As String) - this runs the specified sql string and returns the dataset GetDS(ByVal sql As String, ByVal dataTable As String) - Overloaded GetDS Method for specifying what dataTable to put the results into. I did this so i could get a dataset with a specific table and then merge the returned dataset with another ds i might have with other relevant information in it SaveDS(ByVal ds as DataSet) - this saves the passed dataset back to the database SaveDs(ByVal ds as DataSet, ByVal dataTable As String) - saves the passed dataset datatable back to the database I also have a business object that my other business objects derive from: BusinessObject Methods: - GetDS(sql) - GetDS(sql, dataTable) - SaveDS(sql) - SaveDS(sql, dataTable) Derived classes from BusinessObjects: Project - Inherits BusinessObject Methods: - GetAllProjects() : Returns a dataset with all projects - GetProjectByID() : Returns a dataset with the specified Project - Save(ds) : Saves the specified dataset back to the database Employee - Inherits BusinessObject Methods - GetAllEmployees() : Returns a dataset with all employees - GetEmployeeByID() : Returns a dataset with specified employee Now, I think I am almost there with understanding n-Tier architecture, i just a few simple questions about my structure above: 1. Am I on the right track here with creating the right objects to do the right things? I don't feel like I am? 2. I just started looking into typed datasets and would like to use them in this application but I have no idea how to work them into my static structure diagram or how to properly use them. Is there a good doc I can read about implementing typed datasets into my architecture 3. If i implement the structure above, I would need to place my sql statements into my Project and Employee objects which your not supposed to do. My understanding is all SQL queries are to be placed in the data layer? 4. If I am passing all of this information back and forth with datasets, how does vb.net know which tables to insert the data into when I pass the dataset back to the data layer? would i need to specify another string for the table to save to? 5. I also read something about Collections of objects, Is this the way I want to go? I couldn't find any information on making Collections of Business Objects? I guess I just need some direction as to where to go from here. Thank you. Quote
*Gurus* Derek Stone Posted June 25, 2003 *Gurus* Posted June 25, 2003 You're oversimplifying the function of the data tier far too much. The data tier should be returning business tier objects that can then be used without any knowledge of the underlying database. For instance, you have the following two classes defined in your business tier: Public Class Project '... End Class 'Project Public Class ProjectCollection Inherits ArrayList '... End Class 'ProjectCollection A method call to your data tier's GetProjects member returns a ProjectCollection object that is populated with one or more Project objects. public ProjectCollection GetProjects() { SqlConnection connection = new SqlConnection(); SqlCommand command = new SqlCommand(); SqlDataReader reader; connection.Open(); command.CommandText = "SELECT * FROM dbo.projects"; command.Connection = connection; reader = command.ExecuteReader(); ProjectCollection pc = new ProjectCollection(); while (reader.Read()) { Project p = new Project(); //... pc.Add(p) } reader.Close(); connection.Close(); return pc; } // end method GetProjects You could then go ahead and pass that ProjectCollection object to your presentation tier which would in turn display the current projects in a form or web form. Quote Posting Guidelines
Guest dkode Posted June 25, 2003 Posted June 25, 2003 Ok, I think i'm starting to get it a little better now one thing, i've read that the data layer is not supposed to have any knowledge of the business layer? do i just pass the dataset back to the business layer that would then place the rows into a collection of project objects?? So basically, for each business object, I also want to have a collection to hold those business objects? i.e. : Project, create a ProjectCollection Employee, create a EmployeeCollection Then once I pass the collection to the presentation tier I can easily bind the collection to comboboxes/listboxes/textboxes etc...? That answers question 1, Any comments on the other things that are confusing to me? I appreciate the help. Thank you very much DKode Quote
*Gurus* Derek Stone Posted June 25, 2003 *Gurus* Posted June 25, 2003 i've read that the data layer is not supposed to have any knowledge of the business layer?That's simply incorrect. Here's an exert from the Data Access Layer of Microsoft's own PetShop implementation to validify my statements: /// <summary> /// Read an order from the database /// </summary> /// <param name="orderId"></param> /// <returns></returns> public OrderInfo GetOrder(int orderId) { //Create a parameter SqlParameter parm = new SqlParameter(PARM_ORDER_ID, SqlDbType.Int); parm.Value = orderId; //Execute a query to read the order using (SqlDataReader rdr = SQLHelper.ExecuteReader(SQLHelper.CONN_STRING_DTC_ORDERS, CommandType.Text, SQL_SELECT_ORDER, parm)) { if (rdr.Read()) { //Generate an order header from the first row CreditCardInfo creditCard = new CreditCardInfo(rdr.GetString(2), rdr.GetString(3), rdr.GetString(4)); AddressInfo billingAddress = new AddressInfo(rdr.GetString(5), rdr.GetString(6), rdr.GetString(7), rdr.GetString(8), rdr.GetString(9), rdr.GetString(10), rdr.GetString(11), rdr.GetString(12), null); AddressInfo shippingAddress = new AddressInfo(rdr.GetString(13), rdr.GetString(14), rdr.GetString(15), rdr.GetString(16), rdr.GetString(17), rdr.GetString(18), rdr.GetString(19), rdr.GetString(20), null); OrderInfo order = new OrderInfo(orderId, rdr.GetDateTime(0), rdr.GetString(1), creditCard, billingAddress, shippingAddress, rdr.GetDecimal(21)); ArrayList lineItems = new ArrayList(); LineItemInfo item = null; //Create the lineitems from the first row and subsequent rows do{ item = new LineItemInfo(rdr.GetString(22), string.Empty, rdr.GetInt32(23), rdr.GetInt32(24), rdr.GetDecimal(25)); lineItems.Add(item); }while(rdr.Read()); order.LineItems = (LineItemInfo[])lineItems.ToArray(typeof(LineItemInfo)); return order; } } return null; } Take note of OrderInfo, which is defined as the function's return type. This type is defined in PetShop's business tier (BLL). As for your other questions regarding DataSets I really see no reason for their use at all. A faster and more appropriate solution would be to retrieve the application's data using DataReaders which would in turn place their contents into new instances of your BLL objects, as is displayed above in both my example and Microsoft's PetShop exert. Quote Posting Guidelines
Guest dkode Posted June 26, 2003 Posted June 26, 2003 Ok, I did the following to implement some collection functionality I created a CollectionsBase class that inherits from System.Collections.CollectionBase within CollectionBase I created 3 methods: Add() Remove() Item() Following a tutorial that showed me how to put these in there to have collection functionality then i created 3 collection classes, one for each of my business entities, ProjectCollection, EmployeeCollection, RevenueGoalCollection those 3 inherit from my BaseCollection class so they all have the 3 methods mentioned above. Am i headed in the right direction with creating these collection classes? p.s. i also find that i am asking myself if a method should be shared/not shared? How do i determine when to/when not to make a method shared Thank you. Quote
*Gurus* Derek Stone Posted June 26, 2003 *Gurus* Posted June 26, 2003 Am i headed in the right direction with creating these collection classes?If you need to return more than one object to your business tier, than yes, you are headed in the right direction. How do i determine when to/when not to make a method shared[?] A method shouldn't be shared if it relies on a particular instance of its class. Take the following two examples for instance: Public Class Math Public Shared Function Add(iFirst As Integer, iSecond As Integer) As Integer Return iFirst + iSecond 'Yes, I realize there could be an overflow exception End Function 'Add End Class 'Math The above method should be shared. It gets all its parameters from its argument, and none from instance members of the class. Now take this code snippet for example: Public Class Math Private iAddend As Integer = 100 Public Property Addend() As Integer Get Return iAddend End Get Set(ByVal value As Integer) iAddend = value End Set End Property 'Addend Public Function Add(iNumber As Integer, iSecond As Integer) As Integer Return iNumber + iAddend 'Yes, I realize there could be an overflow exception End Function 'Add End Class 'Math This Add method relies on a property that was set prior to its invoking. Therefore, it can't be shared. Quote Posting Guidelines
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.