| Acknowledgments | xv |
| Introduction | xvii |
| 1 Introduction to Object-Oriented Development | 1 |
| The .NET Framework | 2 |
| Visual Studio .NET Support for Components | 6 |
| General Language Changes in Visual Basic .NET | 8 |
| Data Type Changes | 8 |
| Arrays | 9 |
| String Handling | 10 |
| Structured Exception Handling | 12 |
| Components, Classes, and Objects | 13 |
| Components and Classes | 14 |
| Class and Module Files | 16 |
| Instantiating and Using Classes | 17 |
| Structures | 19 |
| Property Procedures | 20 |
| Working with Methods | 21 |
| Overloading Properties and Methods | 22 |
| Overriding Existing Methods | 23 |
| Events | 24 |
| Interfaces and Implements | 25 |
| Shared Members | 26 |
| Namespaces | 26 |
| Inheritance | 28 |
| Deploying .NET Applications | 29 |
| 2 Architectural Options with .NET | 33 |
| Choosing the Right Architecture | 34 |
| Brief History of Software Architecture | 35 |
| One-Tier Architecture | 35 |
| Two-Tier Architecture | 36 |
| Three-Tier Architecture | 39 |
| Flexible n-Tier Architecture | 43 |
| Solutions Using the .NET Framework | 50 |
| User Interfaces | 51 |
| Facade Functions | 53 |
| Business Layer | 53 |
| Data Access Layer | 54 |
| Data Layer | 54 |
| Analysis and Design | 54 |
| 3 Exception Handling in the .NET Framework | 59 |
| The Exceptional News on .NET | 60 |
| What Is Structured Exception Handling? | 61 |
| Structured Exception Handling | 62 |
| Object-Oriented Exception Handling | 62 |
| The Syntax of the Try Statement | 63 |
| Defining Exception-Handling Objects | 66 |
| Guidelines for Defining Custom Exception Classes | 66 |
| Defining a Custom Base Class for Exceptions | 68 |
| Event Logging | 75 |
| Exception-Handling Objects and Remoting | 78 |
| Creating an Application Exception Class Hierarchy | 80 |
| 4 Implementing the Data Access Layer | 83 |
| The Power of ADO.NET | 84 |
| Performance | 84 |
| Scalability | 84 |
| XML Equals Interoperability | 85 |
| Ease of Use | 85 |
| Components of ADO.NET | 85 |
| Connection Object | 87 |
| Command Object | 88 |
| DataReader Object | 91 |
| DataSet Object | 93 |
| The ADO.NET Data Access Object | 95 |
| Why Have a Data Access Object? | 95 |
| What Will the Data Access Object Do? | 96 |
| Our Approach to Database Access and Usage | 97 |
| Implementing the Data Access Object | 97 |
| The Data Access Object as a Component | 97 |
| Private Variables and Objects | 100 |
| Constructors | 100 |
| Properties | 101 |
| The First Method: Running an SQL Statement and Returning a DataSet | 102 |
| Exception Handling | 103 |
| Logging Exceptions | 103 |
| What Else? | 104 |
| The Complete Code for the runSQLDataSet Method | 107 |
| Using the Data Access Object | 118 |
| Additional Questions About Data Access | 119 |
| How Do We Handle Transactions? | 119 |
| What About Data Concurrency? | 119 |
| What About Connection Pooling? | 119 |
| Can We Use Performance Counters? | 120 |
| 5 Implementing the Security Layer | 121 |
| Overview of Relevant .NET Security Features | 122 |
| Application Security Needs | 123 |
| Forms Authentication Services | 124 |
| Creating the Forms Authentication Architecture for an Application | 125 |
| Configuring the Application | 126 |
| Creating the Credentials Store | 128 |
| Creating the Login Form | 129 |
| Authorization Features | 134 |
| Authorization Types in the .NET Framework | 135 |
| Working with Role-Based Authorization | 135 |
| URL Authorization | 138 |
| The Security Layer | 138 |
| Creating the SecurIt Component | 140 |
| Creating the Secure ASP.NET Header | 148 |
| Using the SecurIt Layer | 153 |
| 6 Implementing Generic Web Client Handlers | 157 |
| User Interface Options with ASP.NET | 158 |
| The Past | 158 |
| The Present | 159 |
| The Future | 161 |
| Choosing Between User Controls and Custom Server Controls | 161 |
| Building User Controls | 163 |
| The Basics of User Controls | 164 |
| Properties of User Controls | 167 |
| Methods of User Controls | 171 |
| Event Bubbling in User Controls | 173 |
| Dynamically Loaded User Controls | 175 |
| Building Custom Server Controls | 178 |
| The Basics of Full Custom Server Controls | 179 |
| Enhanced or Derived Custom Server Controls | 185 |
| Enhanced ASP.NET DropDownList Server Control | 185 |
| Highlighting the Selected Textbox Server Control | 188 |
| Composite Server Controls | 192 |
| Composite ASP.NET MyLabelTextBox Server Controls | 193 |
| Enhanced Composite ASP.NET MyLabelTextBox Server Controls | 201 |
| Events and Custom Server Controls | 205 |
| Using Windows Forms Controls | 206 |
| 7 Implementing the Menu Handlers | 211 |
| A Bit of Menu Strategy | 212 |
| Our Approach to Designing Effective Menus | 214 |
| Creating Menu and Navigation Bar Objects | 218 |
| .NET Technology Used | 218 |
| Designing the Control | 223 |
| The MenuData Component | 224 |
| The Main Menu Custom User Control | 229 |
| The Navigation Bar Custom User Control | 231 |
| Other Options for User Controls | 236 |
| A Visual Basic .NET Windows Forms Example | 238 |
| 8 Implementing the Business Layer | 243 |
| Why Do We Need a Business Layer? | 243 |
| Designing Generic Business Objects | 244 |
| Determining Business Rules | 246 |
| Interacting with the Security Layer | 247 |
| Interacting with the Data Access Layer | 248 |
| Building and Determining Queries Based on Business Rules | 248 |
| Get-Related Stored Procedures | 255 |
| Insert-Related Stored Procedures | 257 |
| Update-Related Stored Procedures | 259 |
| Object-Oriented Features of Visual Basic .NET | 261 |
| Constructors Revisited | 261 |
| Overloading | 263 |
| Overloaded Constructors | 264 |
| Inheritance in HRnet | 265 |
| 9 Implementing Facade Layers | 271 |
| Advantages of Facade Layers and Applications | 272 |
| Designing the Facade Layers | 273 |
| Building the Facade Objects | 275 |
| The EmployeeHRObject Facade Class | 281 |
| EmployeeCSObject Facade Class | 283 |
| 10 Creating the User Interface Template | 287 |
| HRnet Sample Application Specifications | 288 |
| HRnet Application Architecture | 288 |
| HRnet Application Functionality | 289 |
| Creating the HRnet Web Template | 294 |
| The Web Template Layout | 294 |
| The Web Template Files | 295 |
| Starting the HRnet Application | 299 |
| The HRnet Home Page | 301 |
| Web Page Templates: The Other Option | 304 |
| Additional Functionality | 310 |
| Creating the HRnet Windows Forms Template | 311 |
| The Base Forms | 312 |
| The Final Data Entry Form | 315 |
| Calling Code from Web Pages and Windows Forms | 315 |
| 11 Building Information Pages | 317 |
| A Bit of User Interface Strategy | 318 |
| Web-Based vs. Windows-Based Data Presentation Forms | 320 |
| Data Presentation Forms | 321 |
| ASP.NET DataGrid Control for List Forms | 321 |
| Customizing the Default ASP.NET DataGrid Control | 325 |
| Adding Functionality to a Custom DataGrid Control | 328 |
| Adding Better Graphics | 332 |
| Changing the Footer | 333 |
| Adding the GoTo Function | 337 |
| Adding Sorting Capabilities | 342 |
| Adding Final Enhancements | 346 |
| Showing Detail Information | 350 |
| A One-Page Grid and Detail Form | 351 |
| Grid and Detail Forms Separated | 356 |
| Enhancing the Page Grid and Detail Form | 359 |
| State Handling in the Detail Custom Server Control | 363 |
| Scalability and Performance | 367 |
| 12 Implementing the Business Layer: XML Web Services | 373 |
| Implementing XML Web Services | 374 |
| Consuming XML Web Services | 376 |
| Under the Proxy's Hood | 378 |
| Using Publicly Available Services | 378 |
| The WeatherInfo Web Control | 383 |
| SOAP: Your XML Web Service's New Best Friend | 385 |
| Currently Supported Protocols | 385 |
| SOAP Document Structure | 386 |
| Calling from the Client | 389 |
| 13 Using Remoting for Communication | 391 |
| Starting Out | 391 |
| Creating the Server | 393 |
| Building Your First Remoting Client | 395 |
| Building the Remote Host | 400 |
| Windows Hoster | 400 |
| Windows Service Hoster | 401 |
| Remoting the Business Objects | 405 |
| Security Layer | 406 |
| Business Layer | 407 |
| Remoting Deployment | 409 |
| Creating the Client | 410 |
| 14 Wiring the Application Together | 417 |
| Steps for Wiring the Application | 418 |
| Step 1: Menu Structure and Templates | 419 |
| Step 2: Security | 421 |
| Step 3: The Home Page | 429 |
| Step 4: Information and Data Pages | 437 |
| An HRnet Windows Form: Titles | 454 |
| Titles: DataGrid and Detail in One Windows Form | 454 |
| Deploying an Application | 459 |
| Deploy with XCOPY | 460 |
| Deploy Global Files | 460 |
| Deploy by Creating a Windows Installer Package | 463 |
| Assemblies and Versioning | 465 |
| INDEX | 469 |