Weitere ähnliche Inhalte
Ähnlich wie SPCA2013 - SharePoint Nightmares - Coding Patterns and Practices (20)
Kürzlich hochgeladen (20)
SPCA2013 - SharePoint Nightmares - Coding Patterns and Practices
- 3. Who am I?
Donald Hessing
Principal Consultant | Thought Leader SharePoint
@Capgemini Netherlands
(Virtual) Technology Solution Professional for Microsoft
Work full time on SharePoint since 2007
donald.hessing@capgemini.com | @dhessing
Presentation Title | Date
Copyright © Capgemini 2012. All Rights Reserved
3
- 9. Anti Pattern SPList[]
1: web.Lists[“Events”].EnableAttachments = false;
2: web.Lists[“Events”].Update();
SPList object in line 1 is not the same as in line 2
1: SPList list= web.Lists[“Events”];
2: list.EnableAttachments = false;
3: list.Update();
Presentation Title | Date
Copyright © Capgemini 2012. All Rights Reserved
9
- 12. SPRequest
SPRequest is a wrapper for unmanaged class SP.SPRequest
SP.SPRequest is a COM Object that is coming from SharePoint Portal
Services back in 2001
Most retrieval and write operations to SharePoint (SPSite, SPWeb, SPList)
are still implemented by SP.SPRequest
OWSSVR.DLL
SP.SPRequest (Unmanaged)
ClassID:
BDEADEE2-C265-11D0-BCED-00A0C90AB50F
More:
http://hristopavlov.wordpress.com/2009/01/19/understanding-sharepoint-sprequest/
Presentation Title | Date
Copyright © Capgemini 2012. All Rights Reserved
12
- 14. Anti-Pattern SPList.Items
Show the items of from SPList
SPList list = SPContext.Current.List;
for(int i=0;i<100 && i<list.Items.Count;i++)
{
SPListItem listItem = list.Items[i];
ShowTitle(listItem["Title"].ToString());
}
Presentation Title | Date
Copyright © Capgemini 2012. All Rights Reserved
14
- 15. Good or Bad?
Show the items of from SPList
SPList list = SPContext.Current.List;
for(int i=0;i<100 && i<list.ItemsCount;i++)
{
….
}
SPList.ItemCount is an optimized property for performance reasons. This
property can occasionally return unexpected results. If the precise number is
required (in loops) than the SPList.Items.Count property should be used to
preven index out of range exceptions!
Presentation Title | Date
Copyright © Capgemini 2012. All Rights Reserved
15
- 16. Improved Pattern
SPQuery query = new SPQuery();
query.RowLimit = 100;
query. ViewFields = “<FieldRef Name='Title' />”;
query. ViewFieldsOnly = true;
SPListItemCollection items =
SPContext.Current.List.GetItems(query);
for (int i=0;i<items.Count;i++)
{
SPListItem listItem = items[i];
ShowTitle(listItem["Title"].ToString());
}
Presentation Title | Date
Copyright © Capgemini 2012. All Rights Reserved
16
- 17. Anti-Pattern SPList.Items
Each call of .Items retrieves all items from the database!
Not needed when:
SPList.Items[0], SPList.Items.Count
SPList.Items can’t benefit from indices
SPList.Items can LOCK your content database
When needed, sort the collection of SPList.Items in a
SPListCollection variable
Use SPQuery for list data retrieval (CAMLQueryBuilder)
Use SPSiteDataQuery for cross list items
Use the RowLimit property of the query object
Presentation Title | Date
Copyright © Capgemini 2012. All Rights Reserved
17
- 18. Tools… See “Building a SP Factory”
SharePoint 2013
SharePoint 2010
SPDisposeCheck.exe
MSOCAF 2010
FXContrib
SPCOP / SPCAF Foundation
FXCop
StyleCop
Visual Studio 2010 / 2012
MSOCAF 2013
SPCOP / SPCAF Foundation
FXCop – Custom Rules
StyleCop
Visual Studio 2012 / 2013
•
•
Only tool for SharePoint artefacts,
metrics, feature dependency,
managed code and C# analyses!
Includes TFS and 3th Party
integration (FXCop, JSLint,CAT.NET)
Presentation Title | Date
Copyright © Capgemini 2012. All Rights Reserved
18
- 19. (Remote) Event Receivers
Do not use for…
Remote Event Receivers
Setting Unique permissions on large
Remote event receivers are
libraries or sites based on meta data or implemented as a webservice endpoint
person
hosted on-premise or Windows Azure.
Synchronize or mirroring solutions
NO Guaranteed delivery!
Mixing list data and relational data NO Retry like normal messaging
integrity solutions (some relational data infrastructure gives you
stored in SQL Server)
If you need guaranteed delivery, it’s
better to use the new workflow model!
Presentation Title | Date
Copyright © Capgemini 2012. All Rights Reserved
19
- 20. Inherited Permissions
Web object
1
Document library object 1
Folder object
1
Item 1 object
1
Item 2 object
+ User 2 (Reader)
1
Item 3 object
Scope 1
1
+ User 3 (Full Control)
+ User 6 (Contributor)
Presentation Title | Date
Copyright © Capgemini 2012. All Rights Reserved
20
- 21. Fine Grained Permissions
Scope 2
+ User 5 (Reader)
Web object
1
Document library object 1
Scope 3
2
Item 1 object
+ User 2 (Limited Access)
+ User 1 (Limited Access)
Folder object
3
Item 2 object
4
Item 3 object
+ User 2 (Reader)
5
+ User 1 (Contributor)
Scope 4
Scope 1
+ User 3 (Full Control)
+ User 6 (Contributor)
+ User 1 (Limited Access)
+ User 2 (Limited Access)
+ User 5 (Limited Access)
+ User 2 (Contributor)
Presentation Title | Date
Copyright © Capgemini 2012. All Rights Reserved
21
- 25. Tightly Coupled
The implementation of the Service
needs to be available at compile time
The classes cannot be tested in
isolation because they have direct
references to the implementation
(SPWeb, SPSite objects)
Class A can only be created when
Service A implementation is finished
Presentation Title | Date
Copyright © Capgemini 2012. All Rights Reserved
25
- 26. The Service Locator Pattern
Class A can now be tested in Isolation as it doesn’t hold any depencies
with the Service A Implementation
Class A is now loosely coupled to the Service Implementation
Presentation Title | Date
Copyright © Capgemini 2012. All Rights Reserved
26
- 28. DEMO
Service Locator and Repository Pattern
Presentation Title | Date
Copyright © Capgemini 2012. All Rights Reserved
28
- 29. Benefits of these patterns
Service Locator Pattern
Decoupled dependency – Logger implementation can now easily be replaced
The service implementation can be tested in isolation by using a proxy (dummy data)
Repository Pattern
Central point to access data
Can modify the data layer (storage) without too much impact
Strongly typed access to the data
Microsoft Patterns and Practices Guide provides implementation for both
patterns for SharePoint 2010
No specific version for SharePoint 2013 as for now
Presentation Title | Date
Copyright © Capgemini 2012. All Rights Reserved
29
- 31. Dispose() and PowerShell
SharePoint Management Shell ensures disposal of all objects in the
preceding pipeline sequence
Command or single line Pipeline runs a single Thread
Get-SPWebApplication | Get-SPSite -Limit All | Get-SPWeb -Limit All | Select Title
Presentation Title | Date
Copyright © Capgemini 2012. All Rights Reserved
31
- 32. SharePoint Management Shell
SharePoint Management Shell is running multiple lines in the same thread,
ensuring thread safety of the SharePoint unmanaged code
This is achieved by setting the ThreadOptions=‘ReuseThread’
SharePoint Management Shell start-up script:
$ver = $host | select version
if ($ver.Version.Major -gt 1)
{$Host.Runspace.ThreadOptions = “ReuseThread”}
Add-PsSnapin Microsoft.SharePoint.PowerShell
Set-location $home
Presentation Title | Date
Copyright © Capgemini 2012. All Rights Reserved
32
- 33. Multi-line
PowerShell that contains multiple lines require manually disposing of objects
No Help from PowerShell as it doesn’t know when to dispose objects
$site = Get-SPSite "http://sp2013"
Foreach ($web in $site.AllWebs)
{
Write-Host $web.Title
}
Presentation Title | Date
Copyright © Capgemini 2012. All Rights Reserved
33
- 34. Start-SPAssignment & Stop-SPAssignment
Introduced in SharePoint 2010 to overcome memory pressure
Manages objects for the purpose of proper disposal
SPWeb
SPSite
SPSiteAdministration
Presentation Title | Date
Copyright © Capgemini 2012. All Rights Reserved
35
- 37. Why is this important?
PowerShell cannot claim leaked memory until process termination
Scripts that iterate large Web Applications and performs significant
processing require memory management!
Batch jobs for Reporting (Versioning, Checked-out, Access, Boundaries)
Presentation Title | Date
Copyright © Capgemini 2012. All Rights Reserved
38
- 38. PowerShell - CSOM
Roel Hans Bethlehem: “Extending PowerShell with CSOM”
http://sponlinecmdlets.codeplex.com/
Presentation Title | Date
Copyright © Capgemini 2012. All Rights Reserved
39
- 39. DEMO
Service Locator and Repository Pattern SP2010
Service Locator SP2013
Presentation Title | Date
Copyright © Capgemini 2012. All Rights Reserved
40
- 41. App-Model Support
Hosting type
SharePoint
Hosted
AutoHosted
Provider Hosted
SharePoint 2013 On Premises
Windows Classic
X
X
X
Windows Claims
√
X
√
SAML Claims
X
X
√**
√
√
√
SharePoint Online / Office 365
Windows Claims
• No support for the SharePoint Public app store as for now
• SAML might requires additional configuration
http://blogs.technet.com/b/speschka/archive/2012/12/07/using-sharepoint-apps-with-saml-and-fba-sites-in-sharepoint-2013.aspx
Presentation Title | Date
Copyright © Capgemini 2012. All Rights Reserved
42
- 43. REST versus CSOM
SharePoint
Foundation
User Profile
Search
Taxonomy
Feeds
More…
_api
SharePoint
Execute
Query
Client
JavaScript
Library
Silverlight
Library
OData /
REST
.Net CLR
Library
Clients
SP
Hosted
App
Windows
Phone
Auto
Hosted
App
SP
Hosted
App
Windows
8 RT
iOS,
PHP,
Ruby,etc
Presentation Title | Date
Copyright © Capgemini 2012. All Rights Reserved
44
- 44. Limitations REST
REST calls seems to be more chatty than JSOM
REST implementation is still a subset of CSOM
Description
REST
JSOM
Updating Content Types
X
√
Post to person news feed
X/√
√
Large file upload
√
X
Batch updates
X
√
X/√
√
Supports jQuery, plugins
√
X
Environment independent
√
X
Well documented
Presentation Title | Date
Copyright © Capgemini 2012. All Rights Reserved
45
- 47. Key takeaways
SharePoint Server Side Object Model is still using unmanaged code
Code Analyses tools can help, but be aware of the coverage (MSOCAF,
FXCop, SPDispose, SPCop)
The Service Locator and Repository pattern can decouple the actual
implementation and hide complexity in SharePoint data access code
Fully understand the implementation of a SharePoint feature before you
actually use it – Be aware – Blogs can be wrong!
Long running and resource intensive scripts need to dispose object as
well!
Presentation Title | Date
Copyright © Capgemini 2012. All Rights Reserved
48
- 48. Thank You!
01010100 01101000 01100001 01101110
01101011 00100000 01011001 01101111
01110101 0100001
Presentation Title | Date
Copyright © Capgemini 2012. All Rights Reserved
49
- 49. Donald Hessing
Thought Leader SharePoint @Capgemini
Microsoft Certified Master for SharePoint
Contact me:
@dhessing
donald.hessing@capgemini.com
http://nl.linkedin.com/pub/donald-hessing/4/250/924
Presentation Title | Date
Copyright © Capgemini 2012. All Rights Reserved
50