enterprise library 3.0: what’s new?. the story so far… application blocks are reusable,...
TRANSCRIPT
Enterprise Library 3.0: What’s New?
The Story So Far… Application Blocks are reusable, extensible source-code
components that provide guidance for common development challenges
Enterprise Library is a collection of general purpose application blocks
• Caching, Configuration, Cryptography, Data Access, Exception Handling, Logging, Security
• Emphasis on Consistency, Extensibility, Ease of Use and Integration
• Originally designed for .NET Framework 1.1 (January/June 2005 releases) and updated for .NET Framework 2.0 (January 2006 release)
Enterprise Library has become a standard for .NET development and is often used as a basis for custom frameworks
Goals of Enterprise Library 3.0
Address top feedback received for existing application blocks
Provide new application blocks to support additional development challenges
Support integration with relevant features of .NET Framework 3.0
Improve the experience around key development activities
Simplify the development of new application blocks and extensions
Retain compatibility with Enterprise Library 2.0
Enterprise Library 3.0 – New Features At a Glance New application blocks
• Validation Application Block
• Policy Injection Application Block
Improvements to existing application blocks• Data Access Application
Block
• Logging Application Block
.NET Framework 3.0 integration• Logging, Exception
Handling and Validation Application Blocks
Configuration improvements
• Visual Studio-integrated configuration tool
• Environmental Overrides
• Manageable Configuration Source
Automation
• Application Block Software Factory
• Strong Naming Guidance Package
CachingCaching
SecuritySecurity
Data Data AccessAccess LoggingLogging
ExceptionExceptionHandlingHandling
Enterprise Library 3.0 – Application Blocks
Plug-inConfigConfig
Helpers Helpers & Design& Design
Instrumen-Instrumen-tationtation
ObjectObjectBuilderBuilder
CryptographyCryptography
Core
Policy InjectionPolicy Injection
ValidationValidation
New Application Blocks
Validation Application Block – Goals
Specify your validation rules once
• In configuration
• Using attributes
• Programmatically
Easily validate data from anywhere in your application
• Programmatically
• Integrated into Windows Forms, ASP.NET or WCF
Composable validation logic
• Built-in library of common primitive validation rules
• Combine validation rules on type members and using Boolean logic
• Apply multiple validation rule sets to the same types
Supplied Validation Rules Validation Application Block includes the following rules:
• Not Null (value must not be null)
• Contains Characters (e.g. does not contain any of /\?<>”:)
• Regular Expression (e.g. value is a valid e-mail address)
• Range (e.g. must be from 10-20 or 1/1/1950 to 12/31/1999)
• Relative DateTime (e.g. birth date is more than 18 years ago)
• String Length (e.g. string is at least 8 characters long)
• Domain (e.g. must be one of {John, Paul, George, Ringo})
• Enum Conversion (e.g. string can be converted to a value in the Color enum type)
• Type Conversion (e.g. string can be converted to a DateTime)
• Property Comparison (e.g. MaxDate > MinDate)
All validation rules can be negated • E.g String Length must not be between 5 and 10 characters
Composing Validation Rules
You can build complex validation rule sets by combining multiple primitive rules
• Combining rules with Boolean AND / OR logic
• Assigning different validators to different members of a type
• Specifying how nested objects or collections are to be validated
A single type may have multiple rule sets that can be used in different contexts
• For example, Valid for displaying or Valid for persisting
• For example, Valid Customer or Preferred Customer
Specifying Validation Rules using Attributes Attributes allow you to specify validation rules directly within
the type being validated
Validation logic cannot be changed without recompiling
You must own the source code of the type
[StringLengthValidator(1, 50, Ruleset="RuleSetA", MessageTemplate="Last Name must be 1-50 characters")]public string LastName{ get { return lastName; } set { lastName = value; }}
[RegexValidator(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*", MessageTemplate="Invalid e-mail address", Ruleset="RuleSetA")]public string Email{ get { return email; } set { email = value; }}
[ObjectValidator("RuleSetA", Ruleset="RuleSetA")]public Address Address{ get { return address; } set { address = value; }}
[StringLengthValidator(1, 50, Ruleset="RuleSetA", MessageTemplate="Last Name must be 1-50 characters")]public string LastName{ get { return lastName; } set { lastName = value; }}
[RegexValidator(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*", MessageTemplate="Invalid e-mail address", Ruleset="RuleSetA")]public string Email{ get { return email; } set { email = value; }}
[ObjectValidator("RuleSetA", Ruleset="RuleSetA")]public Address Address{ get { return address; } set { address = value; }}
Specifying Validation Rules using Configuration Validation rules are stored in XML and can be edited with the
Enterprise Library configuration tool
Validation logic can be changed without recompiling
You don’t need to own the source code of the type
Validating Data – Programmatically Regardless of how you specify rules, objects are validated in the same
way
If validation fails, you get a collection of ValidationResult objects
Each result includes a message, tag, references to the object and property being validated, and a reference to the original validator.
Validator<Customer> validator = ValidationFactory.CreateValidator<Customer>("Ruleset");ValidationResults results = validator.Validate(customer);if (!results.IsValid){ foreach (ValidationResult result in results) { Console.WriteLine("Message={0}, Key={1}, "Tag={2}", result.Message, result.Key.ToString(), result.Tag == null ? "null" : "\"" + result.Tag.ToString() + "\""); }}
Validator<Customer> validator = ValidationFactory.CreateValidator<Customer>("Ruleset");ValidationResults results = validator.Validate(customer);if (!results.IsValid){ foreach (ValidationResult result in results) { Console.WriteLine("Message={0}, Key={1}, "Tag={2}", result.Message, result.Key.ToString(), result.Tag == null ? "null" : "\"" + result.Tag.ToString() + "\""); }}
Integrating with WinForms, ASP.NET or WCF Supplied “Integration Adapters” make it easier to
validate data in UI layers and service boundaries
Windows Forms and ASP.NET integration allow you to associate a control with the validation rules for a particular type and member
• Validation failures are displayed alongside the control being validated
• Includes events for converting user input to the correct type for validation
WCF integration implemented as a WCF Behavior that validates data at the service interface layer
• Rules are defined within data contract types or using attributes on the service contract
Policy Injection Application Block - Goals Separate cross-cutting concerns from business logic
• Use interception and injection to apply policies at runtime
• Allow policies to be defined using configuration or attributes
Include matching rules for common scenarios
• Applies policies at fine-grained level (searching for specific members or attributes) or coarse-grained (all types in a namespace or assembly)
Include handlers that integrate with Enterprise Library to implement common cross-cutting concerns
• Validation, Logging, Authorization, Exception Handling, Caching, Performance Counters
Allow users to use custom interception mechanisms
Policy Injection Application Block – Basics Policy Injection Application Block provides a factory
for creating or wrapping policy-enabled objects
If policies are defined in attributes or configuration, a proxy is returned in lieu of the real object
When calling policy-enabled members, a handler pipeline is executed before and after the real member is called
Each handler can read and manipulate the data going in and out of the call
Defining Policies
Policies defined in configuration consist of a set of matching rules and the definition of the handler pipeline
Matching rules are predicates that specify which members the policy should apply to
Handlers can also be applied directly to types and members using attributes[ValidationCallHandler]
public void Deposit([RangeValidator(typeof(Decimal), "0.0", RangeBoundaryType.Exclusive, "0.0", RangeBoundaryType.Ignore)] decimal depositAmount){ balance += depositAmount;}
[ValidationCallHandler]public void Deposit([RangeValidator(typeof(Decimal), "0.0", RangeBoundaryType.Exclusive, "0.0", RangeBoundaryType.Ignore)] decimal depositAmount){ balance += depositAmount;}
Supplied Handlers
Validation Handler
• Validates parameters to a method using validation rules defined for the types or as attributes attached to the parameters. If validation fails, an exception is returned and the method is not called.
Logging Handler
• Logs before and/or after the method is called, optionally including the call stack, parameter values, return values, exceptions and call execution time
Authorization Handler
• Uses the specified Authorization provider to check if the current user (thread principal) is authorized to perform the operation. If authorization fails, an exception is returned and the method is not called.
Supplied Handlers (continued)
Exception Handling Handler
• If the method throws an exception, the exception is processed using the Exception Handling Application Block and the returned exception is sent back to the called
Caching Handler
• Checks if the method has recently been called, and if so, returns the cached return value instead of calling the method. If not, the method is called and the return value is cached for future use
Performance Counter Handler
• Increments a number of performance counters to measure the number of times the method is called, the rate at which it is called, the average call duration and the number of exceptions thrown
Improvements to Existing Application Blocks
Data Access Application Block
SQL Server Compact Edition provider
• New SqlCeDatabase class that integrates with the SQL CE managed provider
TransactionScope integration
• Prevents escalation to DTC when multiple updates are made to the same database within a TransactionScope context
Batch updates
• UpdateDataset now supports an updateBatch size parameter
Logging Application Block
Rolling Flat File Trace Listener
• Automatically creates a new file based on file size or date/time
Improved Text Formatter
• Reflected Property Token, to retrieve data out of custom LogEntry types
• Display timestamps in local or UTC time
.NET Framework 3.0 Integration
WCF Integration
Exception Handling Application Block
• ExceptionShieldingBehavior can be specified on a service contract
• Calls the Exception Handling Application Block to shield exceptions from the caller
Logging Application Block
• EntLibLoggingProxyTraceListener can be configured to enable the Logging Application Block to process WCF trace events
• XmlTraceListener can be used with the block to output events in the format consumable by WCF diagnostics tools
Validation Application Block
• ValidationBehavior can be specified on a service contract to enable validation of data contracts
Configuration Improvements
Visual Studio-integrated Configuration Tool Edit configuration from within the IDE
Launched from .config files in the Solution Explorer
Can be configured to point to different sets of assemblies
Environmental Overrides Simplifies
management of configuration files across multiple environments
Separates master configuration files from environment-specific delta files
Specify which settings to override on a node-by-node basis
Merge configuration files using the configuration tool or a command-line tool
Manageable Configuration Source
Configuration Source designed to make it easier to build more manageable applications
Based on the FileConfigurationSource, allowing applications to read configuration from any .config file, plus:
• Administrators may publish changes to applications’ configuration using Group Policy
• The resulting merged configuration is published using WMI to enable querying through operations tools such as Microsoft Operations Manager
No code changes required by developers to support this!
Automation
Application Block Software Factory Enterprise Library 3.0 includes a new software factory
for building your own application blocks and extensions to existing application blocks
Features include:
• Code generation in either C# or Visual Basic .NET
• Solution templates for Application Blocks and Provider Libraries
• Recipes to create custom providers for Enterprise Library application blocks
Including Validators, Trace Listeners, Exception Handlers and Authorization Providers
Strongly-typed or property bag-based configuration
• Recipes to create new factories, provider bases and providers for your own blocks
• Recipes to create design-time configuration code from runtime configuration classes
Application Block Software Factory
Strong Naming Guidance Package
Strong-naming Enterprise Library is recommended, but complex
• 90+ projects, including design-time and tests
• Use of [InternalsVisibleTo] attribute for testing
Strong Naming Guidance Package automates:
• Generating strong-name key pairs
• Specifying that projects should be strong-named
• Updating [InternalsVisibleTo] to include public key
Can be run on Enterprise Library or any other solution
Enterprise Library 3.0 also ships with pre-built, strong-named assemblies which you can use if you don’t want to modify the code.
finally{
Migration from previous versions
This release is 100% API compatible with the previous January 2006 release of Enterprise Library
Configuration formats for existing blocks are unchanged, but assembly version numbers and possibly public key tokens will need to be changed
Multiple versions of Enterprise Library can be installed on the same machine, but cannot be used together in the same application
Enterprise Library 3.0 can be used with either .NET Framework 2.0 or .NET Framework 3.0 installed
• WCF-specific functionality requires .NET Framework 3.0
Resources
Download Enterprise Library and related resources from:
• http://msdn.microsoft.com/practices
Join the Enterprise Library Community at:
• http://codeplex.com/entlib
Read blogs from the Enterprise Library team at:
• http://msdn.microsoft.com/practices/Comm/EntLibBlogs/