WPF & EF 4

italiansaucyΛογισμικό & κατασκευή λογ/κού

13 Δεκ 2013 (πριν από 3 χρόνια και 6 μήνες)

80 εμφανίσεις

WPF

& EF 4

Tales From the Trenches

Introductions




Nathan Allen
-
Wagner


Senior .NET Architect

Bennett Adelson Consulting

www.bennettadelson.com

nallen
-
wagner@bennettadelson.com

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

1.
Self Tracking Entities

2.
Repositories

a.
Enabling Change Tracking

b.
Saving Changes

3.
Customized template

a.
Partial Classes

/ Methods

b.
Delayed Initialization

c.
Undo


WPF / MVVM

1.
INotifyPropertyChanged

2.
Undo / Redo

3.
MVVM & Locators

4.
Keyboard Focus

5.
Reactive Programming

6.
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

Web

Y

N

N

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




M
odel
V
iew
C
ontroller




M
odel

V
iew
P
resenter




M
odel
V
iew
V
iew
M
odel

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

…h
ides 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)
Share entity
dll

with client

2)
Client entities track their changes

3)
Changes sent back to service

4)
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.
INotifyPropertyChanged

2.
Undo / Redo

3.
MVVM & Locators

4.
Keyboard Focus

5.
Reactive Programming

6.
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:
C
ontinuousLinq’s

ReactiveObject


http://clinq.codeplex.com/



WPF


Tips and Tricks


WPF
Tips and Tricks


Keyboard

Focus


Toolbars don’t caus
e “
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

nallen
-
wagner@bennettadelson.com





Blog

http://blog.alner.net

Podcast

http://NorthCoastCodeCast.net


Twitter

@
nathanaw