SlideShare una empresa de Scribd logo
1 de 33
Michael Cummings
C# .NET Developer – Design Portfolio
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
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
- Foundation.dll -

Object Modeling of Business Entities, Implementing Custom & .NET Framework Interfaces




                                                                                        4
- AppTypes.dll -

Object Modeling of Business Entities, Implementing .NET Framework Interfaces, Utilizing Strongly-Typed
Generic Collections




                                                                                                         5
- 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
Unit Testing Using System.Reflection Namespace




                                                 7
- 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
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
Basic Functionality of UI




                            10
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
- 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
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
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
- 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
- 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
--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
- 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
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
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
-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
-Example Page-

ISBN Registry Management Interface

(Usage of GridView and DetailView Server Controls to display information to end-user)




                                                                                        23
-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
-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
-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
<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
-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
-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
- 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
- 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
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
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

Más contenido relacionado

Destacado (8)

Senior C# .Net Developer job in London, see @bilal_abrs
Senior C#  .Net Developer job in London, see @bilal_abrsSenior C#  .Net Developer job in London, see @bilal_abrs
Senior C# .Net Developer job in London, see @bilal_abrs
 
Senior C# .Net Developer job in London from abrs
Senior C#  .Net Developer job in London from abrsSenior C#  .Net Developer job in London from abrs
Senior C# .Net Developer job in London from abrs
 
Mes .Net Developer Description
Mes .Net Developer DescriptionMes .Net Developer Description
Mes .Net Developer Description
 
Junior .Net Developer
Junior .Net DeveloperJunior .Net Developer
Junior .Net Developer
 
Senior it consultant in usa
Senior it consultant in usa Senior it consultant in usa
Senior it consultant in usa
 
Madhu Kopparapu Resume
Madhu Kopparapu ResumeMadhu Kopparapu Resume
Madhu Kopparapu Resume
 
Guided Reading: Making the Most of It
Guided Reading: Making the Most of ItGuided Reading: Making the Most of It
Guided Reading: Making the Most of It
 
A Guide to SlideShare Analytics - Excerpts from Hubspot's Step by Step Guide ...
A Guide to SlideShare Analytics - Excerpts from Hubspot's Step by Step Guide ...A Guide to SlideShare Analytics - Excerpts from Hubspot's Step by Step Guide ...
A Guide to SlideShare Analytics - Excerpts from Hubspot's Step by Step Guide ...
 

Similar a C# .NET Developer Portfolio

Carlos Amador .Net Portfolio
Carlos Amador .Net PortfolioCarlos Amador .Net Portfolio
Carlos Amador .Net Portfolio
CMA_SlideShare
 
Il 09 T3 William Spreitzer
Il 09 T3 William SpreitzerIl 09 T3 William Spreitzer
Il 09 T3 William Spreitzer
wspreitzer
 

Similar a C# .NET Developer Portfolio (20)

C#Portfolio
C#PortfolioC#Portfolio
C#Portfolio
 
Carlos Amador .Net Portfolio
Carlos Amador .Net PortfolioCarlos Amador .Net Portfolio
Carlos Amador .Net Portfolio
 
Pratk kambe rac
Pratk kambe racPratk kambe rac
Pratk kambe rac
 
Folio3 - An Introduction to PHP Yii
Folio3 - An Introduction to PHP YiiFolio3 - An Introduction to PHP Yii
Folio3 - An Introduction to PHP Yii
 
Developing Next-Gen Enterprise Web Application
Developing Next-Gen Enterprise Web ApplicationDeveloping Next-Gen Enterprise Web Application
Developing Next-Gen Enterprise Web Application
 
Software Portfolio - SetFocus
Software Portfolio - SetFocusSoftware Portfolio - SetFocus
Software Portfolio - SetFocus
 
Cognos Software Development Kit
Cognos Software Development KitCognos Software Development Kit
Cognos Software Development Kit
 
Il 09 T3 William Spreitzer
Il 09 T3 William SpreitzerIl 09 T3 William Spreitzer
Il 09 T3 William Spreitzer
 
AD303: Building Composite Applications for IBM Workplace Collaboration Servic...
AD303: Building Composite Applications for IBM Workplace Collaboration Servic...AD303: Building Composite Applications for IBM Workplace Collaboration Servic...
AD303: Building Composite Applications for IBM Workplace Collaboration Servic...
 
Prashant Patel
Prashant PatelPrashant Patel
Prashant Patel
 
new final CV
new final CVnew final CV
new final CV
 
Actively looking for an opportunity to work as a challenging Dot Net Developer
Actively looking for an opportunity to work as a challenging Dot Net DeveloperActively looking for an opportunity to work as a challenging Dot Net Developer
Actively looking for an opportunity to work as a challenging Dot Net Developer
 
Actively looking for an opportunity to work as a challenging Dot Net Developer
Actively looking for an opportunity to work as a challenging Dot Net DeveloperActively looking for an opportunity to work as a challenging Dot Net Developer
Actively looking for an opportunity to work as a challenging Dot Net Developer
 
Mark Jackson\'s Portfoilo
Mark Jackson\'s PortfoiloMark Jackson\'s Portfoilo
Mark Jackson\'s Portfoilo
 
James Turner (Caplin) - Enterprise HTML5 Patterns
James Turner (Caplin) - Enterprise HTML5 PatternsJames Turner (Caplin) - Enterprise HTML5 Patterns
James Turner (Caplin) - Enterprise HTML5 Patterns
 
Optimizing Code Reusability for SharePoint using Linq to SharePoint & the MVP...
Optimizing Code Reusability for SharePoint using Linq to SharePoint & the MVP...Optimizing Code Reusability for SharePoint using Linq to SharePoint & the MVP...
Optimizing Code Reusability for SharePoint using Linq to SharePoint & the MVP...
 
Manikanta_Chimata
Manikanta_ChimataManikanta_Chimata
Manikanta_Chimata
 
IBM WebSphere Portal
IBM WebSphere PortalIBM WebSphere Portal
IBM WebSphere Portal
 
Onion Architecture with S#arp
Onion Architecture with S#arpOnion Architecture with S#arp
Onion Architecture with S#arp
 
Kasi Resume
Kasi ResumeKasi Resume
Kasi Resume
 

C# .NET Developer Portfolio

  • 1. Michael Cummings C# .NET Developer – Design Portfolio
  • 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. 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. - Foundation.dll - Object Modeling of Business Entities, Implementing Custom & .NET Framework Interfaces 4
  • 5. - AppTypes.dll - Object Modeling of Business Entities, Implementing .NET Framework Interfaces, Utilizing Strongly-Typed Generic Collections 5
  • 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. Unit Testing Using System.Reflection Namespace 7
  • 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. 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
  • 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. - 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. 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
  • 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. - 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. - 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. --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. - 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. 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. 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. -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. -Example Page- ISBN Registry Management Interface (Usage of GridView and DetailView Server Controls to display information to end-user) 23
  • 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. -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. -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. <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. -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. -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. - 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. - 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. 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. 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