9

para crear nuestros datos de prueba, se utiliza la siguiente variación del patrón Builder (ejemplo simplificado!): Clase¿Cómo generar código basado en otra clase?

muestra:

public class Person 
{ 
    public string Name { get; set; } 
    public string Country { get; set; } 
} 

El constructor:

public class PersonBuilder 
{ 
    private string name; 
    private string country; 

    public PersonBuilder() 
    { 
     SetDefaultValues(); 
    } 

    private void SetDefaultValues() 
    { 
     name = "TODO"; 
     country = "TODO"; 
    } 

    public Person Build() 
    { 
     return new Person 
        { 
         Name = name, 
         Country = country 
        }; 
    } 

    public PersonBuilder WithName(string name) 
    { 
     this.name = name;    
     return this; 
    } 

    public PersonBuilder WithCountry(string country) 
    { 
     this.country = country; 
     return this; 
    } 
} 

NOTA: La el contexto del ejemplo en sí no es relevante. Lo importante aquí es cómo en el ejemplo, una clase de generador como PersonBuilder se puede generar completamente mirando la clase de entidad (Persona) y aplicando el mismo patrón - ver abajo.

Ahora imagina que la clase de persona tiene 15 propiedades en lugar de 2. Tomaría algunos monos para implementar la clase de constructor, mientras que teóricamente, podría generarse automáticamente desde la clase Persona. Podríamos usar generación de código para configurar rápidamente la clase de constructor y agregar código personalizado más adelante si es necesario.

El proceso de generación de código debería tener en cuenta el contexto (nombre y propiedades de la clase de persona), por lo que la generación simple de código basado en texto o magia regex no se siente aquí. Se prefiere una solución que sea dinámica, no basada en texto y que pueda activarse rápidamente desde el interior del estudio visual.

Estoy buscando la mejor manera de realizar la generación de código para escenarios como este. Reflexión? ¿Cofesor? Plantillas T4? Resharper Live plantillas con macros?

Estoy deseando ver algunas grandes respuestas :)

Respuesta

2

La solución T4 es una opción integrada así Visual Studio. Puede usar la reflexión dentro de la plantilla T4 para generar realmente el código.

0

Si es solo para ensayos, considere un marco de burla como RhinoMocks:

internal class PersonBuilder 
{ 
    private MockRepository _mockRepository; 
    private IPerson _person; 

    public PersonBuilder() 
    { 
     _mockRepository = new MockRepository(); 
     _person = _mockRepository.Stub<IPerson>(); 
    } 

    public PersonBuilder WithName(string name) 
    { 
     _person.Name = name; 
     return this; 
    } 

    public PersonBuilder WithCountry(string Country) 
    { 
     _person.Country= Country; 
     return this; 
    } 

    public IPerson Build() 
    { 
     _mockRepository.ReplayAll(); 
     return _person; 
    } 

} 

De esta manera su constructor puede evolucionar junto con su necesidad. Además, no necesita cambiar su método de compilación. Simplemente agregue métodos "WithX".

+0

Ya usamos burlas extensamente en nuestras pruebas unitarias, pero nunca pensé en usar simulaciones para esto :). Creo que sería una gran manera de resolver este problema en particular, pero no la cuestión general, que tiene un alcance más amplio que solo las pruebas. ¡Pero muchas gracias por esta respuesta de todos modos! –

2

Añadimos una función en CodeSmith Generator 5.x que le permite generar código existente. Por favor, eche un vistazo a eso documentation here. También puede usar reflection o cualquier biblioteca .NET en una plantilla de generador de CodeSmith.

Gracias -Blake Niemyjski

0

Tener una mirada hacia el enfoque de modelado ABSE y su IDE, AtomWeaver. ABSE es un modelado basado en plantillas y un marco de generación de código, donde un modelo (no tiene nada que ver con UML o MDA) se crea mediante la aplicación de "bloques de construcción" (átomos). Estos átomos son híbridos de plantilla/programa y son sensibles al contexto: un átomo puede generar código de acuerdo con su ubicación en el árbol y la presencia/ausencia de ciertos átomos.

El modelo de host (AtomWeaver en este caso) "ejecutará" el modelo para obtener el código fuente deseado. El modelo puede ser "la fuente": cambie el modelo y regenere tantas veces como sea necesario.

AtomWeaver no está integrado en Visual Studio, pero puede trabajar a su lado sin ningún problema.

Cuestiones relacionadas