C# .NET Developer Portfolio


Published on

1 Like
  • Be the first to comment

No Downloads
Total views
On SlideShare
From Embeds
Number of Embeds
Embeds 0
No embeds

No notes for slide

C# .NET Developer Portfolio

  1. 1. Michael Cummings C# .NET Developer – Design Portfolio
  2. 2. TABLE OF CONTENTS • Business Tier Object Framework………………………………..…...3 • Library Phase 1: Windows Forms & Business Layer……………..…9 • Library Phase 2: ADO.NET 3.5 Data Access & Entity Layer….......13 • Library Phase 3: ASP.NET Web Application………….…………...20 • Resumé…...…………………………………………………………32 ABOUT MICHAEL CUMMINGS Seattle, WA 98103  (406) 546-0952 michael.cummings@setfocus.com SUMMARY Highly motivated C# Software Developer/Programmer with experience using object oriented design techniques and programming languages, including Microsoft .NET Technologies. Designed, developed and documented multi-tier applications with Web and database integration. Demonstrated leadership abilities and team work skills as well as ability to accomplish tasks under minimal direction and supervision. http://www.linkedin.com/in/mikewcummings TECHNICAL SKILLS Programming Languages: C#, XML, HTML, CSS, JavaScript, T-SQL .NET Skill Set: .NET Framework 3.5 and Common Type System, ASP.NET, SilverLight, AJAX, XAML, WPF, WCF, ADO.NET, LINQ, .NET Class Libraries, Web Services Databases: MS SQL Server 2008 Software: Visual Studio 2008 2
  3. 3. Business Tier Object Framework – Retail Services Overview: Developed Business Tier components for Retail Services Company. Two primary assemblies were constructed: • Foundation.dll : Interface and Base Classes • AppTypes.dll: Various Entity, Collection, and Exception classes Project requirements included integrating new assemblies into existing object framework and verifying functionality using detailed unit-testing. Business objects were required to implement .NET Framework interfaces and extend .NET base classes whenever possible. Code required extensive documentation to improve maintainability. To support this objective, the techniques utilized included Custom Attributes and XML Build Documentation. Key Knowledge Components: • Object Modeling of Business Entities • Customizing Exception and Event Handling • Improving Meta-Data using Custom Attributes • Unit Testing using System.Reflection namespace • Utilizing Strongly-Typed Generic Collections • Implementing .NET Framework and Custom Interfaces • Extending .NET Framework Base Classes • Generating XML Release Build Documentation Design Approach: The approach to this project was to create functional business objects easily consumable by the presentation and data access layer at runtime. Business objects supported custom binary and XML serialization for preserving application state between sessions and communicating in a distributed environment. Whenever possible, custom objects were developed by implementing .NET Base Classes and extending standard .NET Interfaces. Examples of this include implementing .NET 2.0 Generic Interfaces such as IComparable<T>, IComparer<T> and standard interfaces such as ISerializable. Usability and flexibility of objects was enhanced by providing intuitive operator overloading and overriding base class methods such as Object.GetHashCode(). Furthermore, customized exception classes were built to provide application specific error information and an EventLogger class was developed to register delegates to customized collection modification events. For proper integration and regression analysis, the code was unit-tested during development using test scenarios and runtime reflection. To support future maintainability, code was commented using .NET XML documentation generated on build as well as customized attributes viewable at runtime using reflection or via the MSIL Manifest using ILDASM.exe. 3
  4. 4. - Foundation.dll - Object Modeling of Business Entities, Implementing Custom & .NET Framework Interfaces 4
  5. 5. - AppTypes.dll - Object Modeling of Business Entities, Implementing .NET Framework Interfaces, Utilizing Strongly-Typed Generic Collections 5
  6. 6. - AppTypes.dll (cont.) - Improving Meta-Data using Custom Attributes, Extending .NET Framework Base Classes Customizing Exception and Event Handling, Extending .NET Framework Base Classes 6
  7. 7. Unit Testing Using System.Reflection Namespace 7
  8. 8. - CODE SAMPLE - Improving Meta-Data using Custom Attributes, Generating XML Release Build Documentation namespace AppTypes { /// <summary> /// The Product class is responsible for representing the various products and services bought or sold by the company. /// </summary> [DeveloperInfo("Michael Cummings", Date="08/15/09", Title="developer")] [CustomDescription("The Product class is responsible for representing the various products and services bought or sold by the company.")] [Serializable] public class Product : IComparable<Product> { /// <summary> /// Assignment overload for converting Product objects to legacy DataAccess.ProductStruct's /// </summary> /// <param name="p">Product object to be converted</param> /// <returns>Resulting DataAccess.ProductStruct</returns> public static explicit operator DataAccess.ProductStruct(Product p) { return new DataAccess.ProductStruct() { CategoryID = p.CategoryID.ToString(), ID = p.ID, ProductName = p.ProductName, QuantityPerUnit = p.QuantityPerUnit, ReOrderLevel = p.ReOrderLevel, SupplierId = p.SupplierID.ToString(), UnitPrice = p.UnitPrice, UnitsInStock = p.UnitsInStock, UnitsOnOrder = p.UnitsOnOrder }; } ... 8
  9. 9. Windows Forms Presentation & Business Layer – Library Phase 1 Overview: Developed a Windows Forms-based front-end application to support the principal functions of a lending library’s day-to-day operations including adding new members and checking books in and out. The front-end interfaces with a SQL Server 2008 database via existing Data Access Layer assemblies. The following were general requirements and provisions: • Develop easily maintainable code that makes efficient use of database resources • Provide sophisticated front-end validation logic to ensure data-integrity • Construct an intuitive, functional interface which requires minimal training for users Key Knowledge Components: • Designing intuitive non-modal user-interface under ambiguous design guidelines • Validating complex input using Regular Expressions • Providing user input feedback via error providers • Incorporating existing n-tier architecture for scalability • Developing effective exception and error handling • Binding of GridView controls at runtime to data source • Segregating presentation logic from business rules by creating middle-tier Business layer Design Approach: The approach to this project was to build a functional UI with low cost of training and minimal development time. Windows Forms was well-suited for this approach. The UI was organized based on the design requirements set forth by the stakeholders. The front-end uses tabs to represent the discrete actions required by the application with a global search function for pulling and viewing information on members. An intermediate business layer was developed to enforce business rules and directly invoke data access layer components. All user input is validated as controls leave focus which provides immediate feedback using error providers. This design approach prevents needless and unsafe trips to the database with malformed data. Exceptions of business and database logic (such as dependencies between members and checked-out items) are thrown at underlying layers and handled by the front-end when the user submits the information. The exceptions are then presented to the user in a meaningful non-technical format. Exceptions of these types were not checked on losing control focus; this decision was made to improve scalability and database performance at the cost of immediate feedback in some cases. 9
  10. 10. Basic Functionality of UI 10
  11. 11. Use of Error Providers and Validators on Required Fields Providing Immediate Feedback Front-End Handling and Presentation of Business & Data Access Tier Exceptions, Data Presentation & Data Source Binding via GridView Objects 11
  12. 12. - CODE SAMPLE - Business Layer Sample /// <summary> /// Check-out item based on unique ID to specified member /// </summary> /// <param name="memberID">Member ID</param> /// <param name="isbn">ISBN</param> /// <param name="copyNum">Copy Number</param> /// <param name="expired">Output indicating Member expiration status</param> /// <remarks>Will not checkout item if member ID has expired</remarks> public void TryCheckOut(short memberID, int isbn, short copyNum, out bool expired) { if (GetMember(memberID).ExpirationDate >= DateTime.Now) { expired = false; DataAccessLayer.CheckOutItem(memberID, isbn, copyNum); } else expired = true; } /// <summary> /// Returns items currently checked-out by member /// </summary> /// <param name="memberID">Member ID</param> /// <param name="atLimit">Output indicating whether member has reached item checkout limit</param> /// <returns>ItemsDataSet</returns> /// <remarks>Alerts with output parameter if member has reached checkout limit</remarks> public ItemsDataSet GetItems(short memberID, out bool atLimit) { ItemsDataSet items = DataAccessLayer.GetItems(memberID); atLimit = false; if (items.Tables[0].Rows.Count > 3) atLimit = true; return items; } ... 12
  13. 13. Windows Forms Data Access & Entity Layer – Library Phase 2 Overview: Developed back-end data access & entity layers to support the lending library application from Phase 1. The new assemblies utilize ADO.NET 3.5 technologies which replace the Phase 1 classic ADO.NET infrastructure. In addition, SQL stored procedures were created to enhance database performance. The following were general requirements and provisions: • Design the Entity and Data Access Tiers • Integrate with Existing Business and Presentation Layer w/o Modification • Utilize LinqToSQL Object Model to Abstract Data Provider Code Key Knowledge Components: • Designing encapsulated layers and adhering to existing interfaces • Creating ADO.NET 3.5 LinqToSQL object model of database • Developing SQL stored procedures and views to enhance database performance • Developing SQL test scripts to confirm stored proc error handling • Implementing disconnected state access via DataSet objects Design Approach: The approach to this project was to incorporate .NET 3.5 technologies into the existing infrastructure and improve database performance by developing robust stored procedures for common business processes. To maximize efficiency, database state is presented to users via a disconnected model that returns the connection to the database immediately after the data is queried. The .NET DataSet & GridView objects were implemented to accomplish this. This approach drastically improved performance by minimizing database connections and locks while reusing open connections across multiple, distinct function calls. The library application connects to SQL Server 2008 and, as a result, a Linq-To-SQL object model was developed to represent the database. The object model was based on views created in the database to represent business objects, rather than the actual normalized table structure. Additionally, the object model incorporates inheritance to emulate the database structure. To improve performance through caching, SQL Server stored procedures were developed for the business processes. Stored procedures include error handling which returns meaningful exceptions to upper layers when database rules are violated. All stored procedures utilize transactions which rollback when errors are encountered to ensure only atomic transactions occur which leave the database in a consistent state. To facilitate testing, test scripts were developed to programmatically verify the correct behavior of the stored procedures. 13
  14. 14. 14
  15. 15. LINQ-To-SQL Object Model of Business Entities: DataContext Objects & Methods Items DataSet based on LINQ-To-SQL Object Model for Disconnected State Access 15
  16. 16. - CODE SAMPLE - Data Access Layer CheckOutItem call to SQL Stored Procedure using LINQ-To-SQL DataContext /// <summary> /// Checks out item /// </summary> /// <param name="memberNumber">Member ID to check-out item to</param> /// <param name="isbn">ISBN to check-out</param> /// <param name="copyNumber">Copy Number to check-out</param> public void CheckOutItem(short memberNumber, int isbn, short copyNumber) { LibraryDataContext libraryDataContext = new LibraryDataContext(); try { libraryDataContext.CheckOutItem(memberNumber, isbn, copyNumber); } catch (SqlException ex) { //SQLExceptions with the number 50000 are user-generated //This check needs to be performed before evaluating state //property as a misleading error-code could be raised if a //server-generated error state matched a user-defined error //state in a stored proc if (ex.Number == 50000) { switch (ex.State) { //State 1-3 are caused by a null argument in a required parameter //Currently, these are all represented by a single error code case 1: case 2: case 3: throw new LibraryException(ErrorCode.CheckOutFailed, ex.Message, ex); case 4: throw new LibraryException(ErrorCode.NoSuchMember, ex.Message, ex); case 5: throw new LibraryException(ErrorCode.ExpiredMember, ex.Message, ex); case 6: throw new LibraryException(ErrorCode.ItemNotFound, ex.Message, ex); case 7: throw new LibraryException(ErrorCode.ItemNotLoanable, ex.Message, ex); case 8: throw new LibraryException(ErrorCode.ItemAlreadyOnLoan, ex.Message, ex); default: throw new LibraryException(ErrorCode.GenericException, "Unknown Application Specific DB Error Occurred", ex); } } else throw new LibraryException(ErrorCode.GenericException, "General DB Error Occurred", ex); } } 16
  17. 17. - CODE SAMPLE - Checkout Item Stored Procedure USE [library] GO /****** Object: StoredProcedure [dbo].[usp_CheckOutItem] Script Date: 10/08/2009 09:21:08 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO --Checkout item ALTER PROC [dbo].[usp_CheckOutItem] @member_no SMALLINT = NULL, @isbn INT = NULL, @copy_no SMALLINT = NULL AS BEGIN TRY --Check for null arguments in required inputs IF @member_no IS NULL RAISERROR ('MemberNo is null', 11, 1) IF @isbn IS NULL RAISERROR ('ISBN is null', 11, 2) IF @copy_no IS NULL RAISERROR ('Copy is null', 11, 3) --Checks for existing member IF NOT EXISTS (SELECT * FROM member WHERE member_no = @member_no) BEGIN RAISERROR ('Member ID does not exist', 11, 4) END --Checks for existing member without expired library card IF EXISTS (SELECT * FROM memberView WHERE member_no = @member_no AND expr_date < GETDATE()) BEGIN RAISERROR ('Adult member expired', 11, 5) END --Checks for existing item IF NOT EXISTS (SELECT * FROM copy WHERE isbn = @isbn AND copy_no = @copy_no) BEGIN RAISERROR ('Item does not exist', 11, 6) END --Checks if item can be loaned IF EXISTS (SELECT * FROM item WHERE isbn = @isbn AND loanable = 'N') BEGIN RAISERROR ('Item is not loanable', 11, 7) END --Checks if item is already on loan IF EXISTS (SELECT * FROM copy WHERE isbn = @isbn AND copy_no = @copy_no AND on_loan = 'Y') BEGIN RAISERROR ('Item is already on loan', 11, 8) END BEGIN TRAN 17
  18. 18. --Insert loan entry INSERT INTO loan (isbn, copy_no, title_no, member_no, out_date, due_date) SELECT @isbn, @copy_no, copy.title_no, @member_no, --Set checkout date to today GETDATE(), --Set due date in 2 weeks DATEADD(DAY, 14, GETDATE()) FROM copy WHERE isbn = @isbn AND copy_no = @copy_no --Update loan status to unavailable UPDATE copy SET on_loan = 'Y' WHERE isbn = @isbn AND copy_no = @copy_no COMMIT TRAN --Return success RETURN 0 END TRY BEGIN CATCH --Rollback all current transactions IF @@TRANCOUNT >0 ROLLBACK TRAN --Create variables for storing error information DECLARE @ErrorMessage NVARCHAR(4000) DECLARE @ErrorSeverity INT DECLARE @ErrorState INT --Store error information SELECT @ErrorMessage = ERROR_MESSAGE(), @ErrorSeverity = ERROR_SEVERITY(), @ErrorState = ERROR_STATE() --Rethrow error RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState) --Return fail RETURN -1 END CATCH 18
  19. 19. - CODE SAMPLE - Data Access Layer LINQ Queries /// <summary> /// Retrieves collection of Items checked-out to specified member /// </summary> /// <param name="memberNumber">Member ID to check for loan items</param> /// <returns>ItemsDataSet containing all current loan items</returns> public ItemsDataSet GetItems(short memberNumber) { ItemsDataSet itemsDataSet = new ItemsDataSet(); LibraryDataContext libraryDataContext = new LibraryDataContext(); IQueryable<Item> query = null; try { query = from item in libraryDataContext.Items where item.MemberNumber == memberNumber select item; } catch (Exception ex) { throw new LibraryException(ErrorCode.NoSuchMember, "Member not found", ex); } try { foreach (var result in query) { itemsDataSet.Items.AddItemsRow(result.ISBN, result.CopyNumber, result.Title, result.Author, result.MemberNumber.Value, result.CheckoutDate.Value, result.DueDate.Value); } } catch { //Null result set...do nothing } return itemsDataSet; } /// <summary> /// Retrieves a member /// </summary> /// <param name="memberNumber">MemberID to search for</param> /// <returns>Member object of type Adult or Juvenile</returns> public Member GetMember(short memberNumber) { LibraryDataContext libraryDataContext = new LibraryDataContext(); Member query = null; try { query = (from member in libraryDataContext.Members where member.MemberID == memberNumber select member).Single(); } catch (Exception ex) { throw new LibraryException(ErrorCode.NoSuchMember, "Member not found", ex); } return query as Member; } 19
  20. 20. ASP.NET Web Application Front End – Library Phase 3 Overview: Developed rich ASP.NET front-end application with re-use of Phase 2 data access, entity, & business layer assemblies. Backwards compatibility and regression testing were performed to ensure any additions or modifications to underlying layers did not break Phase 1 Windows Forms thick client. The following were general requirements and provisions: • Design ASP.NET Web-Based UI to interact with Phase 2 underlying architecture • Integrate additional requested functionality without breaking Phase 1 Windows Forms client • Enforce Forms-based authentication to protect access to data Key Knowledge Components: • Designing and developing attractive web-based UI • Maintaining state using client-side and server-side strategies • Implementing custom role-based security using Forms Authentication • Reusing and extending existing underlying n-tier architecture • Optimizing ASP.NET performance using Caching • Integrated accessibility options to support diverse user base Design Approach: The approach to this project was to develop a rich ASP.NET web application to integrate with loosely coupled existing n-tier architecture and to extend functionality as required. Extended functionality included additional business layer and data access methods to query and update SQL Server 2008 Database. State is managed via diverse client-side and server-side strategies including cookies, viewstate, query strings, session state, and caching. Web front-end was developed using modern standards-based design strategies. Markup was validated against W3C XHTML Transitional guidelines and WCAG Priority 2 & Access Board Section 508 accessibility requirements. Presentation logic was separated from markup using a primarily CSS-based Theme with light use of Skins for specific server controls. This approached produced lean semantic XHTML markup to improve code clarity, search engine parsing, and performance. Customized alpha-channel graphics were developed using open source professional imaging tools (GIMP – GNU Image Manipulation Program). Additionally, ASP.NET Master pages and User Controls were used to produce a consistent look and feel as well as maximize maintainability and code re-use. Navigation and browsing context are maintained using bread-crumb and tree- view functionality via global site map. To improve performance, usability, and feedback response, asynchronous processing of requests was implemented using AJAX partial-page postback strategies. In addition, the AJAX Toolkit was used to provide a rich user interface such as dynamic calendar controls. Application response and load management were improved through use of Caching to ensure frequently used resources were pre-compiled without sacrificing up- to-date state representation. To enforce security over an external network, the ASP.NET web application employed a Forms-based authentication model with custom configured roles. To also improve security, global application error handling is employed to redirect end-user generated errors to customized error pages which present helpful information without compromising sensitive implementation details. 20
  21. 21. Project Structure: Admin/ - All main content pages as well as custom user controls. This folder is only accessible to authenticated users with the “Librarian” role. App_Code/ – Helper classes used throughout the project App_Data/ – Simple XML file which provides the source data for selecting states in certain dropdown boxes. App_Themes /– Global style information. Design is primarily CSS driven with some use of Skins for server controls. Also contains all image files used throughout the website Bin/ – Compiled assemblies. This references the underlying business, data access, and entities layer. Also, this contains the AJAX Control Toolkit server controls used to provide “rich” interface in certain areas of the site. MasterPage.aspx – Centralized common functionality shared across site including “look-and-feel,” navigation, and current user / logout operation Web.sitemap – Data source for global navigation. Global.asax – Used for application level error-handling and redirection to custom error page Error.aspx Default.aspx – Home page web.config – Site configuration. Custom configured to restrict access to admin folder and set global default theme. 21
  22. 22. -Example Page- Implementing custom role-based security using Forms Authentication (Login Page – Option to remember user using cookie) (Welcome Page – Current logged in user display and ability to log-out) 22
  23. 23. -Example Page- ISBN Registry Management Interface (Usage of GridView and DetailView Server Controls to display information to end-user) 23
  24. 24. -Example Page- Checkout Book Processing (Data Entry Page – Cross-Page Post to Confirmation Page) (Confirmation Page – Displays Eligibility, User Detail, & Book Detail w/ Option to Cancel Operation) 24
  25. 25. -Detailed Walkthrough- Search Member Page This page allows Librarians to perform lookups based on Member ID. The page performs front-end Javascript validation as well as server-side user-input and database validation (checking that the member exists). A query string approach is used which rejects inappropriate values manually edited in the URL. Member information is displayed when a valid ID exists. Juveniles are automatically upgraded to adults if they are over 18 years of age and expired members have a button appear to renew their card. Librarians can view the items on loan with overdue items highlighted in red. The library can check-in loan items directly from this screen. The check-in process is performed asynchronously using a partial page postback. User “processing” feedback is provided via a looping animation as the action is performed (shown below - it is a freeze-frame of dots arranged in a circle). The following sections will show “under-the-hood” code samples of the browser output below: • Master Page • Theme (CSS & Skin) • Content Page • User Control (Loans.ascx) • C# Code-Behind 25
  26. 26. -Master Page- The page contains: • Basic content layout & placeholder elements • Stylesheet reference • Ajax Control Toolkit reference and Script Manager control • Sitemap datasource w/ corresponding SiteMapPath and TreeView controls • LoginName control and link to log out / end session <%@ Master Language="C#" AutoEventWireup="true" CodeFile="MasterPage.master.cs" EnableTheming="true" Inherits="MasterPage" %> <%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="cc1" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>Central Library Management System</title> <link rel="stylesheet" type="text/css" href="~/App_Themes/Global/StyleSheet.css"/> </head> <body> <form id="form1" runat="server"> <asp:SiteMapDataSource ID="SiteMapDataSource" runat="server" ShowStartingNode="false" EnableCaching="True" CacheDuration="30000" /> <asp:ScriptManager ID="ScriptManager" runat="server"> </asp:ScriptManager> <div id="container"> <div id="header"> <asp:Image ID="imgHeaderTop" runat="server" ImageUrl="~/App_Themes/Global/Images/libHeaderTopRounded.PNG" AlternateText="header" /> <div id="headerBar" class="white"> <div id="breadcrumbs"> <asp:SiteMapPath ID="SiteMapPath" runat="server" Font-Names="Verdana" Font-Size="0.8em" PathSeparator=" > "> <PathSeparatorStyle Font-Bold="True" ForeColor="#5D7B9D" /> <CurrentNodeStyle ForeColor="#333333" /> <NodeStyle Font-Bold="True" ForeColor="#7C6F57" /> <RootNodeStyle Font-Bold="True" ForeColor="#5D7B9D" /> </asp:SiteMapPath> </div> <div id="userlog"> Current User: <asp:LoginName ID="LoginName" runat="server" Font- Bold="true" /> &nbsp; &nbsp; <asp:LinkButton ID="logout" Text="Logout" runat="server" CausesValidation="false" onclick="logout_Click"></asp:LinkButton> </div> </div> <asp:Image ID="imgHeaderBottom" class="footer" runat="server" ImageUrl="~/App_Themes/Global/Images/libHeaderBottomRounded.PNG" AlternateText="header" /> </div> <div id="nav"> <asp:Image ID="imgNavTop" runat="server" ImageUrl="~/App_Themes/Global/Images/libNavTopRounded.PNG" AlternateText="header" /> <div class="white"> 26
  27. 27. <asp:UpdatePanel ID="navUpdatePanel" runat="server"> <ContentTemplate> <asp:TreeView ID="TreeViewMain" CssClass="innercontent" runat="server" DataSourceID="SiteMapDataSource" EnableTheming="True" onprerender="TreeViewMain_PreRender" ontreenodeexpanded="TreeViewMain_TreeNodeExpandCollapse" ontreenodecollapsed="TreeViewMain_TreeNodeExpandCollapse"> <ParentNodeStyle Font-Bold="True" /> <SelectedNodeStyle Font-Underline="True" /> <RootNodeStyle Font-Bold="True" Font-Size="20px" /> <NodeStyle HorizontalPadding="3px" NodeSpacing="4px" /> <LeafNodeStyle Font-Bold="false" Font-Size="18px" /> </asp:TreeView> </ContentTemplate> </asp:UpdatePanel> </div> <asp:Image ID="imgNavBottom" class="footer" runat="server" ImageUrl="~/App_Themes/Global/Images/libNavBottomRounded.PNG" AlternateText="header" /> </div> <div id="content"> <asp:Image ID="imgContentTop" runat="server" ImageUrl="~/App_Themes/Global/Images/libContentTopRounded.PNG" AlternateText="header" /> <div class="innercontent white"> <asp:ContentPlaceHolder id="PlaceHolderMain" runat="server"></asp:ContentPlaceHolder> </div> <asp:Image ID="imgContentBottom" class="footer" runat="server" ImageUrl="~/App_Themes/Global/Images/libContentBottomRounded.PNG" AlternateText="header" /> </div> </div> </form> </body> </html> 27
  28. 28. -Theme (CSS Stylesheet) - Sample of some of the CSS rules applied: body { background-image: url('Images/bkgd_tile.gif'); background-repeat: repeat; margin: 0; padding: 0; } #container { width: 770px; height: auto; margin-top: 10px; margin-bottom: 10px; margin-left:auto; margin-right:auto; } #header { margin-bottom: 5px; } #nav { float: left; width: auto; height: auto; } #nav a:link { color: blue; } #nav a:visited { color: blue; } #nav a:hover { color: blue; } #content { float: right; height: auto; width: auto; } … -Theme (Server Control Skins) - Sample of Server Control skins used: <asp:GridView runat="server" HeaderStyle-BackColor="#6666FF" /> <asp:DetailsView runat="server" FieldHeaderStyle-CssClass="bold" FieldHeaderStyle- BackColor="#6666FF" /> 28
  29. 29. -Content Page - The page contains: • Semantic XHTML markup for non-interactive display elements • Input validation, both server-side and client-side • Custom user controls for displaying data <%@ Page Title="Search Member" Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="membersearch.aspx.cs" Inherits="membersearch" %> <%@ Register src="../UserControls/Loans.ascx" tagname="Loans" tagprefix="uc1" %> <%@ Register src="../UserControls/MemberStatus.ascx" tagname="MemberStatus" tagprefix="uc2" %> <asp:Content ID="Content1" ContentPlaceHolderID="PlaceHolderMain" Runat="Server"> <h1>Search for Member</h1> <p>Enter the ID you would like to perform a search for. Current member status will be displayed, along with items currently on loan. <em>Remember the following:</em></p> <div class="containerPane"> <ul> <li>Loan items can be checked in</li> <li>Overdue items on loan will be highlighted in yellow</li> <li>Expired members will have a highlighted expiration and can be renewed</li> <li>Juveniles who have reached 18 years of age are converted to adults</li> </ul> </div> <div class="containerPane" > <table class="form"> <tr> <td>Member ID:</td> <td> <asp:TextBox ID="tbxID" runat="server" ></asp:TextBox> <asp:RequiredFieldValidator ID="rfvID" runat="server" ControlToValidate="tbxID" Display="Static" ErrorMessage="Member ID required" ToolTip="Member ID required" >*</asp:RequiredFieldValidator> <asp:RangeValidator ID="rngvID" runat="server" ControlToValidate="tbxID" Display="Static" ErrorMessage="Member ID must be between 1 and 32,767" MaximumValue="32767" MinimumValue="1" ToolTip="Member ID must be between 1 and 32,767" Type="Integer" >*</asp:RangeValidator> <asp:Button ID="btnSearch" runat="server" onclick="btnSearch_Click" Text="Search" CssClass="leftMargin" /></td> </tr> </table> </div> <div class="containerPane"> <uc2:MemberStatus ID="ucMemberStatus" runat="server" /> </div> <div class="containerPane"> <uc1:Loans ID="ucLoans" runat="server" /> </div> <div class="containerPane"> <asp:ValidationSummary ID="SearchValidationSummary" runat="server" HeaderText="Please correct the following errors:" /> </div> </asp:Content> 29
  30. 30. - User Control (loans.ascx) - The page contains: • Script Manager Proxy (due to Master Page Script Manager) to support AJAX • Update Panel & Progress controls to provide partial-page postback w/ immediate user feedback • DataSource-bound Gridview Control to display loan information with custom Command field <%@ Control Language="C#" AutoEventWireup="true" CodeFile="Loans.ascx.cs" Inherits="Loans" %> <link rel="Stylesheet" href="../../App_Themes/Global/StyleSheet.css" /> <asp:ScriptManagerProxy ID="ScriptManagerProxy" runat="server"></asp:ScriptManagerProxy> <asp:UpdatePanel ID="LoanUpdatePanel" runat="server" UpdateMode="Conditional"> <ContentTemplate> <div class="containerPane"> <asp:Label ID="lblAtLimit" runat="server" Visible="false" ForeColor="Red" Text="Maximum Loan Items"></asp:Label> <br /> <asp:GridView ID="LoanGridView" runat="server" DataSourceID="LoanDataSource" AutoGenerateColumns="False" Width="548px" ondatabound="LoanGridView_DataBound" onrowcommand="LoanGridView_RowCommand" > <Columns> <asp:BoundField DataField="ISBN" HeaderText="ISBN" HeaderStyle-Wrap="False" /> <asp:BoundField DataField="CopyNumber" HeaderText="Copy" /> <asp:BoundField DataField="Title" HeaderText="Title" /> <asp:BoundField DataField="Author" HeaderText="Author" /> <asp:BoundField DataField="CheckoutDate" HeaderText="Out" HtmlEncode="False" DataFormatString="{0:MM/dd/yy}" /> <asp:BoundField DataField="DueDate" HeaderText="Due" HtmlEncode="False" DataFormatString="{0:MM/dd/yy}" /> <asp:ButtonField ButtonType="Button" CommandName="Checkin" HeaderText="Check-In" ShowHeader="True" Text="Check" /> </Columns> </asp:GridView> </div> <div class="containerPane"> <asp:Label ID="lblCheckInStatus" runat="server" Text=""></asp:Label> </div> <asp:UpdateProgress ID="UpdateProgress" runat="server" AssociatedUpdatePanelID="LoanUpdatePanel"> <ProgressTemplate> <asp:Image ID="imgProcessing" runat="server" ImageUrl="~/App_Themes/Global/Images/spinner3-black.gif" AlternateText="Processing" /> </ProgressTemplate> </asp:UpdateProgress> <asp:ObjectDataSource ID="LoanDataSource" runat="server" TypeName="MC.LibraryBusiness.BusinessLayer" SelectMethod="GetItems" EnableCaching="True" CacheDuration="30" > <SelectParameters> <asp:QueryStringParameter Name="memberID" QueryStringField="id" Type="String" DefaultValue="0" /> </SelectParameters> </asp:ObjectDataSource> </ContentTemplate> </asp:UpdatePanel> 30
  31. 31. - C# Code Behind - The page contains code-behind for the Loans.ascx user control (Master & Content pages excluded): • Highlight operation for overdue items on GridView_DataBound event • Check-in operation for GridView_RowCommand event using System; ... /// <summary> /// Displays Loan Information /// </summary> /// <remarks>uses query string</remarks> public partial class Loans : System.Web.UI.UserControl { /// <summary> /// Performs highlight operations /// </summary> /// <param name="sender">object sender</param> /// <param name="e">event arguments</param> protected void LoanGridView_DataBound(object sender, EventArgs e) { int DueDateCellIndex = 5; foreach (GridViewRow row in LoanGridView.Rows) { if (DateTime.Parse(row.Cells[DueDateCellIndex].Text) < DateTime.Now) { row.BackColor = Color.Yellow; } } lblAtLimit.Visible = (LoanGridView.Rows.Count > 3); } /// <summary> /// Checks In Item /// </summary> /// <param name="sender">object sender</param> /// <param name="e">event arguments</param> protected void LoanGridView_RowCommand(object sender, GridViewCommandEventArgs e) { int isbnCellIndex = 0; int copyCellIndex = 1; BusinessLayer biz = new BusinessLayer(); try { int cmdRowIndex = Convert.ToInt32(e.CommandArgument); int isbn = Convert.ToInt32(LoanGridView.Rows[cmdRowIndex].Cells[isbnCellIndex].Text); short copy = Convert.ToInt16(LoanGridView.Rows[cmdRowIndex].Cells[copyCellIndex].Text); biz.CheckIn(isbn, copy); LoanGridView.DataBind(); lblCheckInStatus.OKText(String.Format("ISBN: {0} Copy: {1} successfully checked in", isbn, copy)); } catch { lblCheckInStatus.AlertText("Check-in failed"); } } } 31
  32. 32. MICHAEL CUMMINGS Seattle, WA 98103  (406) 546-0952 michael.cummings@setfocus.com SUMMARY Highly motivated C# Software Developer/Programmer with experience using object oriented design techniques and programming languages, including Microsoft .NET Technologies. Designed, developed and documented multi-tier applications with Web and database integration. Demonstrated leadership abilities and team work skills as well as ability to accomplish tasks under minimal direction and supervision. http://www.linkedin.com/in/mikewcummings TECHNICAL SKILLS Programming Languages: C#, XML, HTML, CSS, JavaScript, T-SQL .NET Skill Set: .NET Framework 3.5 and Common Type System, ASP.NET, SilverLight, AJAX, XAML, WPF, WCF, ADO.NET, LINQ, .NET Class Libraries, Web Services Databases: MS SQL Server 2008 Software: Visual Studio 2008 SetFocus, LLC Seattle, WA 8/09 - 10/09 .NET Masters Program • Developed solutions for diverse programming scenarios in C#, employing object–oriented programming concepts such as: encapsulation, inheritance, polymorphism, and abstraction. • Used C#, LINQ and ADO.NET to define and implement secure middle-tier components using both connected and disconnected environment strategies. Components were consumed by web applications and windows applications utilizing SQL Server and stored procedures to perform logical business transactions. • Created and deployed XML Web Services using ASP.NET and Windows Communication Foundation (WCF). Consumed Web Services from both Windows forms and ASP.NET web applications. • Created complex business components in C# using .NET Class Library assemblies while migrating and implementing them in a multi-tier environment suitable for .NET Remoting, XML Web Services and WCF Services to address application infrastructure issues associated with building scalable enterprise level applications used by many clients. • Developed a Windows n-tiered “Public Library Management System” application and then ported the application to a dynamic ASP.NET Internet/Intranet model utilizing the same secure middle tier data access components. Non-public web pages were secured using Windows integrated and ASP.NET forms security models. • Created Deployment projects for .NET applications using Microsoft’s MSI packages. 32
  33. 33. PROFESSIONAL EXPERIENCE Seattle, WA 9/08 – 7/09 IT Advisory Associate • Assessed risk of internal IT controls over financial reporting. Conducted audits of access controls, change management, program development, and computer operations.http://msdn.microsoft.com/en-us/library/ms178472.aspx • Managed heavy work loads in high stress situations under ambiguous direction. Demonstrated adaptability in frequently changing situations and relationships. • Interacted frequently with managerial and executive level personnel at wide variety of clients. Bothell, WA 6/08 – 8/08 Enterprise IT Intern • Performed monitoring and troubleshooting of network devices. Modeled network topologies. Documented business processes & developed KPI's. Maintained internal SharePoint site. • Demonstrated ability to learn new skills and apply diagnostic problem solving techniques. Tacoma, WA 6/07 – 9/07 E-Commerce Intern • Developed websites utilizing xhtml, css, javascript. Managed content for intranet and extranet. Maintained internal SharePoint site. • Built content base for new intranet release which involved achieving buy-in from business stakeholders and influencing others without authority. EDUCATION Seattle University Seattle, WA 6/08 Bachelor of Arts, Business Administration - Overall GPA 3.92 • Major E-Commerce / Information Systems, Minor Philosophy • University Honors Program 33