streda 21. júla 2010
nedeľa 21. februára 2010
Book review - Microsoft .NET: Architecting Applications for the Enterprise
I've just ended reading of Microsoft .NET: Architecting Applications for the Enterprise (PRO-Developer) from MS Press. It's very valued book for .NET developers and architects.
In the first part book describes fundamental design princiles for design of object oriented software:
- separation of concerns
- open/closed principle
- Liskov's substitution principle
- dependency inversion principle
In the second part the book describes how to apply design patterns to architect layers of enterprise systems:
- business layer
- service layer
- data access layer
- presentation layer
As for design patterns this book widely refers on the Patterns of Enterprise Application Architecture from Martin Fowler. In the business layer chapter I expected some detailed description how to design solutions with Windows Workflow Foundation, but this technology is poorly covered in this book. Except for some point outs I think it is good decision to invest your time to the reading of this book.
štvrtok 4. februára 2010
PowerShell and Team Foundation Server API
Team Foundation Server has a great API and you can use it to extend its capabilities or automatize tasks and so on. This API can be also used from PowerShell, which demonstrates this post. You have to know only how to use .NET from PowerShell. Following code uses TFS API to get count of new lines of code added in specified changeset:
1: ################################################################################
2: #
3: # Get-AddedLinesCountInChangeset
4: #
5: ################################################################################
6:
7: param
8: (
9: [string] $tfsUrl = $(throw "TFS URL is required"),
10: [int] $changeSetId = $(throw "Changeset ID is required")
11: )
12:
13: [void][Reflection.Assembly]::LoadWithPartialName("Microsoft.TeamFoundation.Client")
14: [void][Reflection.Assembly]::LoadWithPartialName("Microsoft.TeamFoundation.VersionControl.Client")
15:
16: function LinesCountInFile($item, $version)
17: {
18: $tempFile = [System.IO.Path]::GetTempFileName()
19:
20: $itemVersion = $vcs.GetItem($item.ServerItem, $version)
21: $itemVersion.DownloadFile($tempFile)
22: $linesCount = (Get-Content $tempFile | Measure-Object).Count
23: Remove-Item -Force $tempFile
24:
25: $linesCount
26: }
27:
28: function ProcessChange($change)
29: {
30: if($change.Item.ItemType -eq "Folder")
31: {
32: return $False
33: }
34:
35: $extensions = ".cs", ".aspx", ".ascx", ".xml", ".xaml", ".config"
36:
37: foreach ($extension in $extensions)
38: {
39: if ($change.Item.ServerItem.EndsWith($extension))
40: {
41: return $True
42: }
43: }
44:
45: return $False
46: }
47:
48: $tfs = [Microsoft.TeamFoundation.Client.TeamFoundationServerFactory]::GetServer($tfsUrl)
49: $vcs = $tfs.GetService([Microsoft.TeamFoundation.VersionControl.Client.VersionControlServer])
50:
51: $thisVersionSpec = New-Object Microsoft.TeamFoundation.VersionControl.Client.ChangesetVersionSpec $changeSetId
52: $previousVersionSpec = New-Object Microsoft.TeamFoundation.VersionControl.Client.ChangesetVersionSpec ($changeSetId - 1)
53:
54: $chs = $vcs.GetChangeset($changeSetId)
55: $totalLinesCount = 0
56: Write-Host
57:
58: foreach ($change in $chs.Changes)
59: {
60: if (ProcessChange($change))
61: {
62: $nameParts = $change.Item.ServerItem.Split("/")
63: $fileName = $nameParts[$nameParts.Length - 1]
64:
65: $thisLength = LinesCountInFile $change.Item $thisVersionSpec
66:
67: if ($change.ChangeType.ToString().Contains("Add"))
68: {
69: $previousLength = 0
70: }
71: else
72: {
73: $previousLength = LinesCountInFile $change.Item $previousVersionSpec
74: }
75:
76: $added = $thisLength - $previousLength
77:
78: Write-Host "$fileName $added" -Fore Yellow
79: if ($added -gt 0) { $totalLinesCount = $totalLinesCount + $added }
80: }
81: }
82:
83: Write-Host "------------------------------------------------------"
84: Write-Host "Total Lines: $totalLinesCount" -Fore Green
85: Write-Host
If you use TFS 2005/2008 then specify only server url, when TFS 2010 then specify url including the collection.