There was one drawback, however. The templates generated the files in the several layers with the same name. So a table named “Pet”, would create three “Pet” classes: one in the entity layer, one in the business layer and one in the data layer. On top of that, the derived classes had the same filename, “Pet.cs” (located in a different directory). So when coding or debugging, all tabs in Visual Studio had the same label “Pet.cs”, very confusing! My objective was to change the filenames and classes in such a way that the class renames are refactored in the whole solution and that the file renames are reflected in MS Visual Source Safe. My solution: a macro!
So go to “Tools > Macros > New macro project” to create a macro project. Macros are written in VB. In the macro project I created the several methods, one for each layer and some common methods. It’s pretty self explanatory. The RenameSymbol() method causes the rename of the class to be reflected in all of the code!
Sub RenameBussinessLayer() For Each project As Project In DTE.Solution.Projects If project.Name = "BusinessLogic" Then For Each item As ProjectItem In project.ProjectItems If item.Name = "Generated" Or item.Name = "Implementation" Then RenameBLClasses(item.ProjectItems) End If Next End If Next End Sub
Sub RenameBLClasses(ByVal items As ProjectItems) For Each item As ProjectItem In items item.Open() Dim doc As Document doc = item.Document If doc.Path.Contains("BusinessLogic") Then RenameClass(doc, "BL") End If Next End Sub
Sub RenameClass(ByVal doc As Document, ByVal layer As String) Dim element As CodeElement Dim newName As String Dim postFix As String element = GetClassElement(doc.ProjectItem.FileCodeModel.CodeElements) If layer = "DAL" Then postFix = "Repository" newName = element.Name & postFix ElseIf layer = "BL" Then postFix = "Manager" ' class name is already OK, only filename needs to change newName = element.Name ElseIf layer = "OM" Then postFix = element.Name ' class name is already OK, only filename needs to change newName = element.Name End If ' Rename file If Not doc.ProjectItem.Name.EndsWith(postFix & ".cs") Then doc.ProjectItem.Name = newName & ".cs" End If ' Rename class If Not element.Name.EndsWith(postFix) Then Dim elementToRename As CodeElement2 elementToRename = DirectCast(element, CodeElement2) elementToRename.RenameSymbol(newName) End If End Sub
Private Function GetClassElement(ByVal elements As CodeElements) As CodeElement For Each element As CodeElement In elements If element.Kind = vsCMElement.vsCMElementImportStmt Then Continue For ElseIf element.Kind = vsCMElement.vsCMElementClass Then Return element Else Return GetClassElement(GetElementMembers(element)) End If Next Return Nothing End Function
Private Function GetElementMembers(ByVal element As CodeElement) As CodeElements Dim elements As EnvDTE.CodeElements If TypeOf element Is EnvDTE.CodeNamespace Then elements = CType(element, EnvDTE.CodeNamespace).Members ElseIf TypeOf element Is EnvDTE.CodeType Then elements = CType(element, EnvDTE.CodeType).Members ElseIf TypeOf element Is EnvDTE.CodeFunction Then elements = DirectCast(element, EnvDTE.CodeFunction).Parameters End If Return elements End Function
This comment has been removed by a blog administrator.
ReplyDelete