Volodymyr Voytyshyn03/17/2012
ManagedExtensibility Framework
Effective Development of Scalable Applications with .NET
Agenda
What is MEF?
Key concepts and features
How to implement …?
What’s new in MEF 2.0?
WHAT IS MEF?
The Problem
No unified approach
for extension application in runtime
The Solution
MEF – Managed Extensibility Framework
Simply
Reliably
Unified
MEF Project
Official Site http://mef.codeplex.com
Developer Microsoft
Started 26.08.2008
License MS Public License(open source)
Last stable release MEF 1 / 12.04.2010(included into .NET 4.0)
MEF focuses on…
Extending of ready-made applications by plugins
Plugin 1 Plugin 2
Application
?
How about reflection?
System.Reflection.*Assembly.Load()
…
As a result…
The next unique solution
Not reusable components
Extending by 3rd parties plugins
KEY CONCEPTS AND FEATURES
Composable Part
Part
Export
Import
More Composable Parts
ImportImport
ExportExport
The Main Idea - Composition
Composition Container
Composition Container
Creates parts
Dispose parts
Compose parts
The Part
Typed Contract
The Part
Named Contract
The Part
Extension Point
Extension Point
Composition of Parts
Compositionof parts
Don’t forget…
Add reference
System.ComponentModel.Composition.dll
Using namespaces
System.ComponentModel.Composition.*
More About Import
Export Metadata
Key
Value
Getting Exports
Contract
Returns Lazy
Creation Policy
Default value
Shared
NonShared
Any
Shared == Singleton
Any & Any == Shared
References to Parts
Container keeps reference to part if:
– Part is marked as Shared
– Part implements IDisposable
– One or more imports allow Recomposition
Disposing Composition Container
Dispose parts which implement IDisposable
Reference to parts will be cleaned up
Lazy exports won’t work
Catalog
Catalog
CompositionContainer
Discover parts
Compose parts
Catalog Types
Assembly Catalog
Directory Catalog
Type Catalog
Aggregate Catalog
Deployment Catalog(only for Silverlight)
Recomposition Support
Assembly Catalog
Directory Catalog Refresh()
Type Catalog
Aggregate Catalog auto
Deployment Catalog auto
HOW TO IMPLEMENT… ?
MEF-based Dependency Injection
CompositionContainer
Service Locator
TPart Resolve<TPart>()
void Release<TPart>(TPart part) CommonService Locator
MEF Adapter
MEF vs IoC
+ Ease of programming
+ Resolves dependencies between components
+ Automatic component discovery
+ Can compose types, fields, props and methods
- Slower than IoC containers
- Poor component lifetime management
- No component separation (separate appdomain, process)
Plugin-based Desktop Application
Most Useful Tool
Directory Catalog
Composition Container
File System Watcher
Plugins Folder
Trackchanges
Refresh()
Plugin-based Desktop Application
Allow parts recomposition
Assemblies shadow copy
! Plugin assemblycan not be unloaded in runtime
Plugin-based ASP.NET MVC Application
ASP.NET MVC Application
Models Views Plugins
Models Views
Controlle
rs
Controlle
rs
Plugin-based ASP.NET MVC Application
Integrate MEF into ControllerFactory
MEF-based DependencyResolver
? Compile razor view to separate assembly
WHAT’S NEW IN MEF 2.0?
MEF 2.0 and .NET 4.5
Open Generic Parts
Any type
Convention-based Part Registration
Composition Scoping Enhancements
Global Scope
Request Scope
Composition Container
Logger
Customer Controller
Customer RepositoryFor each request
Once
Composition Provider for ASP.NET MVC Registering in composition container:
– Controllers– Action filters– Model binders
Constructor injection for controllers
ASP.NET MVC: processing of parts
Naming convention
Contract identification
Composition Provider for ASP.NET MVC Composition scopes
– Request scope
– Application scope
MEF Offers…
Easy way for:
Composition independent components
Extending without recompiling
Delivering 3rd party plugins
Ask your question…
Useful Sources
MEF Project (official site)
Managed Extensibility Framework Overview (msdn)
Building Composable Apps in .NET 4 with MEF (msdn)
BCL Team Blog (msdn)
Book of MEF (habrahabr)
Thank You!
Copyright © 2011 SoftServe, Inc.
Contacts
Volodymyr Voytyshyn5 Knyahyni Olhy Str., Rivne 33000, Ukraine
Tel: +38(066) 41 83 509
E-mail: [email protected]@gmail.com
Skype: voytyshin