Module 1: Simplifying Complex Programming with Proven Design Patterns
Applying simple interfaces to intricate algorithms
- Unifying interfaces from subsystems for ease of use and reusability
 
- Implementing the Façade, Observer and thread-safe lazy Singleton patterns
 
Module 2: Automated Test-Driven Development
Automating unit testing
- Shortening development cycles with automated tests
 
- Eliminating regression errors with reusable tests
 
Integrating testing and coding
- Applying the test–first programming practice
 
- Generating immediate red–green feedback for increased code quality and shortened feature development cycles
 
- Organizing, coordinating and running test cases
 
- Isolating dependencies with the Mock–Object pattern for reliable and repeatable testing
 
Refactoring code to improve design
- Improving design while ensuring correct behavior is preserved
 
- Eliminating code duplication by refactoring using the Template Methods pattern and the Hollywood principle
 
Module 3: Applying SOLID Principles
Design by Interface
- Identifying objects by behavior, not type
 
- Organizing state–rich applications with the State pattern
 
- Refactoring to achieve the Single Responsibility Principle
 
- Maintaining the Open-Closed Principle during development
 
Inheritance vs. Aggregation
- Adhering to Interface Segregation for code design
 
- Applying the Liskov Substitutability Principle to ensure correct inheritance
 
- Changing algorithms dynamically at run-time using the Strategy Pattern
 
- Dependency injection vs. Dependency Inversion
 
- Deploying run-time Factory Patterns
 
- Template Methods and the Hollywood Principle
 
Module 4: Threading and Concurrency
Organizing long-running business logic
- Capabilities of Task Parallel Library (Parallel.For and Parallel.Foreach)
 
- Asynchronous C# keywords
 
- Coding using the Awaitable-Awaiter Pattern
 
Module 5: Separation of Concerns (Business Logic – Data)
Object-Relational Mapping (ORM)
- Creating an effective Data Access Layer
 
- Reducing User Interface code with Data Binding
 
- Centralizing data access using the lazy Repository pattern
 
- Determining when to force eager loading
 
Easing data access code with the Entity Framework
- Maintaining data context automatically
 
- Reducing database access code by exploiting Entity Navigation Properties
 
- Eliminating database update code with Entity change tracking
 
Module 6: Separation of Concerns (View - Business Logic)
Strategic (Architectural) Design Patterns
- Designing with MVC, MVP and MVVM
 
- Simplifying complex highly-stateful logic with the State Pattern
 
- Coding controller objects for use with auto-generated entity objects
 
Module 7: Harnessing Lesser-Used C# Language Features
Language shortcuts
- Applying auto-implemented and lambda generated properties
 
- Benefiting from dynamic and implied-type declaration
 
Streamlining program logic
- Instantiating entity objects
 
- Simplifying construction with object initializers
 
Filtering and ordering data with lambda expressions
- Passing lambda expressions to methods (behavior vs. data)
 
- Calling Count, Reverse, Union, Except and other extension methods
 
Applying extended features
- Making code more flexible with delegates
 
- Parameterizing delegates and lambda expressions
 
- Streamlining code with Func<T,R> generic delegates
 
Module 8: Leveraging LINQ Query Keywords
Syntax and semantics
- Coding LINQ queries
 
- Filtering with from, where, orderby and group
 
- Performing inner and outer joins
 
- Generating anonymous types
 
Iterating collections
- Interfacing between C# and LINQ using IEnumerable<T> and IQueryable<T>
 
- Issuing queries on entity and spatial types
 
Connecting to and reading from a database
- Inheriting DbContext objects
 
- Correlating entity classes and data tables
 
- Executing stored procedures and table-valued functions
 
Object Relational Mapping
- Employing code-first and database first mapping to generate entity classes
 
- Optimizing complex mapping including many to many and database inheritance
 
Updating a database
- Inserting, updating and deleting data when Core is integrated with .NET Framework
 
- Error handling and exceptions
 
- Committing and rolling back transactions
 
Module 9: Enumerations and Generic Classes
Dynamic Enumeration
- Comparing IEnumerable<T> and IEnumerator<T>
 
- The yield keyword
 
Module 10: Processing Data with LINQ Queries
Advanced LINQ techniques
- Creating anonymous query results
 
- Retrieving composite views using nested from clauses
 
Referential Integrity and Concurrency
- First-wins, Last-wins and everyone wins scenarios
 
- Protecting concurrency data corruption
 
- Concurrency detection and recovery
 
- Transaction Processing
 
- Recovering from Data Exceptions