我可以自动将代码和新类放在我的解决方案的很多部分中吗?

时间:2012-02-16 15:03:52

标签: c# visual-studio visual-studio-2010 templates t4

我想把我自动生成的代码和新类放在我的解决方案的不同部分。例如:

我有这些项目:

  • 模型
  • DAO
  • 商业
  • 网络

当我在Model项目中手动创建一个新实体时,我想:

  • Model项目中创建您的IDAO课程和IService课程
  • DAO项目中创建您的DAO课程。
  • Business项目中创建您的服务类。
  • Application_Start()文件中创建Web\global.asax文件中用于注册类接口的代码(Denpendency Injection)。

所有事情都是自动的。那么,有可能吗?

3 个答案:

答案 0 :(得分:2)

它总是取决于项目以及您尝试实现的目标。

我使用T4来避免维护冗余代码。在您经常描述的场景中,有些代码感觉多余并且难以实现非冗余。

我会做什么:

  • 以某种方式描述我的模型(T4代码,XML或任何你喜欢的)
  • 创建一个T4模板,该模板采用模型并构建模型类
  • 创建一个获取模型并构建DAO类的T4模板
  • 创建一个获取模型并构建业务类的T4模板
  • 创建一个注册依赖注入类的T4模板

当我向模式文件添加新实体时,我会在VS中点击“转换所有模板”或将其添加到构建系统。这将为Model,DAO,Business和Application_Start生成必要的代码。

如果此解决方案的好坏取决于您正在进行的项目以及您希望实现的目标。

答案 1 :(得分:1)

您可以使用Visual Studio宏轻松自动化这类内容。

这是开始的两个地方:

  • 在网络上搜索创建文档的VS宏,或应用您感兴趣的其他操作

  • 查看工具>宏菜单。从这里你可以录制一个临时宏(开始录制,然后执行一个aciton,如创建文档,然后停止录制)。然后在Macros IDE中打开录制宏以查看它生成的代码(对于某些操作,您将无法获得任何内容,但大多数情况下,VS非常擅长通过UI操作生成一些有用的代码)。然后你必须将你记录的代码片段拼接在一起,并且通常很容易构建一个宏来自动执行tedius任务。

答案 2 :(得分:0)

解决!我使用visual studio宏。

Obs:我改变了策略。而不是创建一个T4文件(.tt),我创建一个公共类文件(.cs)与一些将由String.Replace更改的标记。

using System;
// place here your necessary "usings" 

namespace #namespace#
{
    /// <summary>
    /// Class responsible for #entity# data access.
    /// </summary>
    public class #class# : I#class#
    {
    }
}

宏:

Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports EnvDTE90a
Imports EnvDTE100
Imports System.Diagnostics
Imports System.IO

Public Module Templates
    ' Get the active class (in this case will be the entity that you have just created)
    Dim entity As String = DTE.ActiveDocument.Name.Replace(".cs", "")
    Dim projects As Projects = DTE.Solution.Projects
    ' Project where are the template classes   
    Dim projectTemplates As Project = DTE.ActiveDocument.ProjectItem.ContainingProject

    Sub CreateCRUD()

        ' Exemple of creating DAO Class
        CreateClass("NamespaceWhereAreYouProject.Repositorio\ NamespaceWhereAreYouProject.Repositorio.csproj", _
                    "DAL", _
                    " NamespaceWhereAreYouProject.Repository.DAL", _
                    "DAO" + entity, _
                    "DAOTemplate.cs")

    End Sub

    Private Sub CreateClass(ByVal currentProject As String, _
                                 ByVal currentFolder As String, _
                                 ByVal currentNamespace As String, _
                                 ByVal currentClass As String, _
                                 ByVal currentTemplate As String)

        ' Loading attributes
        Dim project As Project = projects.Item(currentProject)
        Dim folder As ProjectItem = project.ProjectItems.Item(currentFolder)
        Dim currentTemplatePath As String = projectTemplates.ProjectItems.Item("Templates") _
            .ProjectItems.Item(currentTemplate).Properties.Item("FullPath").Value
        Dim newClassPath As String = folder.Properties.Item("FullPath").Value + currentClass + ".cs"

        ' Creating class
        folder.ProjectItems.AddFromTemplate(currentTemplatePath, currentClass + ".cs")
        Dim newText As String = File.ReadAllText(newClassPath) _
            .Replace("#class#", currentClass) _
            .Replace("#namespace#", currentNamespace) _
            .Replace("#entity#", entity)
        File.WriteAllText(newClassPath, newText)
    End Sub
End Module