Могу ли я автоматически разместить код и новые классы во многих частях моего решения? - PullRequest
3 голосов
/ 16 февраля 2012

Я хочу поместить код, который я генерирую автоматически, и новые классы в разные части моего решения.Пример:

У меня есть следующие проекты:

  • Модель
  • DAO
  • Бизнес
  • Веб

Когда я создаю вручную новый объект в проекте Model, я хочу:

  • Создать в Model проектировать ваш класс IDAO и класс IService
  • Создать в DAO спроектируйте свой класс DAO.
  • Создайте в Business спроектируйте свой класс Service.
  • Создайте в Application_Start() метод, который находится в Web\global.asax файле кода, который регистрирует интерфейсы для ваших классовИнъекция зависимости.

Все автоматически.Так возможно ли это?

Ответы [ 3 ]

2 голосов
/ 20 февраля 2012

Это всегда зависит от проекта и того, чего вы пытаетесь достичь.

Я использую T4, чтобы избежать необходимости поддерживать избыточный код. В описываемом вами сценарии очень часто встречается код, который кажется избыточным и трудно сделать не избыточным.

Что бы я сделал:

  • Опишите мою модель как-нибудь (код T4, XML или все, что вам нравится)
  • Создайте шаблон T4, который принимает модель, и создайте классы Model
  • Создание шаблона T4, который принимает модель и создание классов DAO
  • Создание шаблона T4, который принимает модель и создание бизнес-классов
  • Создать шаблон T4, который регистрирует классы для внедрения зависимостей

Когда я добавляю новую сущность в файл режима, я нажимаю «Преобразовать все шаблоны» в VS или добавляю ее в систему сборки. Это сгенерирует необходимый код для Model, DAO, Business и Application_Start.

Если это решение хорошее или плохое, зависит от проекта, над которым вы работаете, и того, чего вы хотите достичь.

1 голос
/ 16 февраля 2012

Вы можете довольно легко автоматизировать такого рода вещи с помощью макросов Visual Studio.

Есть два места для начала:

  • Поиск в Интернете макросов VS, которыесоздавать документы или применять другие действия, которые вас интересуют

  • Посмотрите в меню Инструменты> Макросы.Отсюда вы можете записать временный макрос (начните запись, затем выполните действия, такие как создание документа, затем остановите запись).Затем откройте макрос записи в Macros IDE, чтобы увидеть, какой код он сгенерировал (для некоторых действий вы ничего не получите, но большую часть времени VS очень хорошо генерирует что-то полезное из ваших действий пользовательского интерфейса).Тогда вам просто нужно собрать воедино фрагменты кода, которые вы записали, и зачастую довольно просто создать макрос для автоматизации задач Tedius.

0 голосов
/ 27 февраля 2012

Решено!Я использую макросы 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
...