WPF & EF 4 - Tales from the Trenches
Download
Report
Transcript WPF & EF 4 - Tales from the Trenches
WPF & EF 4
Tales From the Trenches
Introductions
Nathan Allen-Wagner
Senior .NET Architect
Bennett Adelson Consulting
www.bennettadelson.com
[email protected]
Introductions
Me - Online
Blog
http://blog.alner.net
Podcast
http://NorthCoastCodeCast.net
Twitter
@nathanaw
Agenda
Quick Intro
Entity Framework
• Models, Repositories, and T4 Templates
• Demos
WPF
• Tips, Tricks, and Approaches
• Undo / Redo
• Demos
Session Goal…
If I Succeed Today…
1. We’ll cover a lot of topics
2. I’ll convince you to download and
explore the demo app.
3. I’ll introduce you to a couple
open-source libraries
Quick Intro – High Level
Entity Framework
WPF / MVVM
1. Self Tracking Entities
2. Repositories
1.
2.
3.
4.
5.
6.
a.
b.
Enabling Change Tracking
Saving Changes
3. Customized template
a.
b.
c.
Partial Classes / Methods
Delayed Initialization
Undo
INotifyPropertyChanged
Undo / Redo
MVVM & Locators
Keyboard Focus
Reactive Programming
Threading
Quick Intro – Relevant Scenarios
How does this apply to ME?
Entity Framework
Undo
MVVM
WPF
Y
Y
Y
WinForms
Y
Y
N
Silverlight
Y*
Y*
Y
Y
N
N
Web
Preview – The Demo App
Demo!
Before we dive in…
… Here’s our demo app
PART 2 – WPF
PART 1
Entity Framework
Definition of Terms: Models
Models Are…
…the “M” in MVC, MVP, MVVM
Model View Controller
Model View Presenter
Model View ViewModel
…the Data
…the “Single Source of Truth”
…Behavioral (methods)
Definition of Terms – Repositories
Repositories are…
…a way to get a model
…a way to save changes to a model
Persistence Ignorance…
…hides data storage / access choices
RDO, ADO, ADO.NET
Nhibernate, EF, Linq2SQL
…separates concerns
…makes unit testing easier
Entity Framework – Model Designer & Code Generator
Entity Framework:
Model Designer
- Database First
- Model First
Code Generator (T4 Templates)
- Default Template
- Self Tracking Entities Template
- Plain Old CLR Objects (POCO) Template
Entity Framework – Self Tracking Entities
Self Tracking Entities…
Originally designed to enable EF over WCF
1)
2)
3)
4)
Share entity dll with client
Client entities track their changes
Changes sent back to service
Service applies changes to context
But… works great for the Desktop too!
Entity Framework – Build your own Repository
Goals for a Repository:
1) Use interfaces for definition
2) Expose methods to get, save and query
3) Keep all EF “stuff” inside.
a.
Clients should not need a reference to
System.Data.Entities
Entity Framework – Repository Demo
Demo – EF Basics
•
•
•
•
•
EF Model
Getting and Applying the STE template
Separating entities into separate project
Interfaces for repository
Multiple Repositories: SQL & XML
Entity Framework – Repository Tips
Demo – EF Tips & Tricks
• Loading Children From the DB
.Include(“”) vs. LoadProperty(o => o.Child)
• Saving
ApplyChanges(), SaveChanges()
MarkAllAddedAsUnmodified(), RefreshAll()
AcceptAllChanges(), StartTrackingAll()
• Deletes
Parent.Remove() does not delete the record…
Entity Framework – Template Tips
Demo – T4 Customizations
• Partial Classes / Methods
Partial Classes = Custom Logic / Properties
Partial Methods = Hooks into property changes
• Undo Hooks
T4 includes calls to UndoService
for property changes
• OnInitializing() & OnInitialized()
Works with DelayedInitializationScope
Entity Framework – Delayed Initialization Scope
Demo - Delayed Init Scope
• Entities call RegisterForEndInit()
• … Then EndInit() called after last scope completes
•
•
•
•
Use in a using block
Supports nesting
ThreadStatic variables to track “current”
Callers can check whether a
scope is active
Entity Framework – Undo / Redo Tracking
Demo – Undo / Redo Tracking
• Each setter tells Undo framework about change
SelfTrackingEntityUndoService.OnChanging()
• Undo framework adds a “change” to the undo stack
• Each “change” knows how to apply the previous value
• More on this later
PART 2 – WPF
PART 2
WPF
WPF – Agenda Revisited
WPF / MVVM
1.
2.
3.
4.
5.
6.
INotifyPropertyChanged
Undo / Redo
MVVM & Locators
Keyboard Focus
Reactive Programming
Threading
WPF – App Goals
Goals for the Demo App
Good Architecture…
… Community says MVVM for WPF / SL.
“Single Source of Truth” rendered in one or more views,
which stay in sync as data changes in the model.
Model contains core data and behavior. View-specific
concerns are in the ViewModel or View.
Undo / Redo support
WPF – Bindings and INotifyPropertyChanged
WPF Bindings & INotifyPropertyChanged
WPF means Powerful Binding Support!
Two-Way bindings require Change Notification
WPF UI elements use DependencyProperties
for change notification.
What about the model…???
WPF – Bindings and INotifyPropertyChanged
Model Change Notification:
System.ComponentModel.INotifyPropertyChanged
• Primary way to tell WPF that a property value
changed
System.Collections.ObjectModel.ObservableCollection
• Primary way to tell WPF that a collection changed
• Implements INotifyCollectionChanged
• Raises an event whenever items added, removed,
replaced or relocated.
WPF – Using an Entity Framework Model
Using a Model – Self Tracking Entities
Partial Methods Revisited
Raising PropertyChanged for “dependent” properties
Validating data
Undo / Redo Support
Importance of INPC for Undo – It changes the model
Available from http://muf.codeplex.com/
Hooking it up – Commands
Optimizations – Undo Batches
WPF – Dealing with ViewModels
Dealing With ViewModels
“Completing the INPC loop”
Snippets for Implementing INPC
– On My Blog (http://blog.alner.net/...)
Remember to raise PropertyChanged for “dependent”
properties
Crazy Cool: ContinuousLinq’s ReactiveObject
– http://clinq.codeplex.com/
WPF – Tips and Tricks
WPF Tips and Tricks
Keyboard Focus
Toolbars don’t cause “LostFocus” event
Use the CommitBindingsBehavior to force bindings.
Demo…
WPF – Tips and Tricks
WPF Tips and Tricks
Design Time & “Blendability”
Use “design-time” detection to populate ViewModels.
Demo…
WPF – Tips and Tricks
WPF Tips and Tricks
Threading
Use the BackgroundWorker for lengthy operations
Marshal all changes back to UI thread via:
– Dispatcher.Invoke() / BeginInvoke()
– SynchronizationContext.Send() / Post()
Warning! Collections are problematic. Some solutions exist,
but each has problematic edge cases.
T4 Template includes SynchronizedContextCollection, which
attempts to marshall changes to UI via
SynchronizationContext.
WPF – Weak References & Weak Events
FYI: Weak References & Weak Events
WPF uses these extensively
Critical to allowing the GC to collect memory
Important when you have GC roots holding on to things
(like static instances). May need a memory profiler.
Event Handlers create a reverse reference. If you don’t
disconnect, it might lock things in memory.
WPF – ViewModel Locators
ViewModel Locator Options
Code-behind / Resource
MVVM Light – Smart Resource
Caliburn – ViewModel-First (awesome framework!)
MEFed MVVM – Using MEF to create ViewModels
My Preference:
Converter Based Locators
Demo (if time permits)
Thanks!
Congratulations! We made it to…
The End!
(If you’d like more info one of these topics, let us know)
Thanks!
Thanks! See you next month!
(Please turn in evals)
Nathan Allen-Wagner
.NET Architect - Bennett Adelson
[email protected]
Blog
http://blog.alner.net
Podcast
http://NorthCoastCodeCast.net
Twitter
@nathanaw