2012-10-13 24 views
5

Tôi đang phát triển một số trình tạo mã để tạo mô hình, bộ điều khiển và chế độ xem dựa trên các bảng cơ sở dữ liệu để tôi có thể tạo trang web Asp.Net MVC3. Tôi có thể tạo ra các mô hình và bộ điều khiển với CodeDOM ngay bây giờ nhưng để tạo ra các khung nhìn, tôi cần một cái gì đó để tạo các khuôn mẫu, như tạo một .cshtml từ một .cs, tôi nghĩ T4 sẽ là ý tưởng hay nhưng một số đồng nghiệp của tôi nhấn mạnh vào việc không sử dụng T4, có cách nào khác không? cảm ơnCó cách nào để tạo ra chế độ xem Dao cạo (.cshtml) dựa trên mẫu bên cạnh T4 không?

+0

Điều gì là sai với t4 theo đồng nghiệp của bạn? –

+3

Không chắc tại sao đồng nghiệp của bạn không muốn sử dụng T4. Đó là một hệ thống rất mạnh và hoàn toàn miễn phí. Nó đi kèm với Visual Studio, vì vậy không có thêm chi phí cấp phép. Đó là một động cơ rất lớn để sử dụng nó. –

+0

Tôi không biết chính xác, họ nói thật là lộn xộn và khó khăn để làm một số mã sạch. – ePezhman

Trả lời

0

Chúng tôi đã sử dụng mã smith rộng rãi và cũng đã viết một plugin. Với t4 mặc dù ou chỉ đơn giản có thể tạo ra các lớp và sau đó loại bỏ các mẫu - tại sao phe đối lập có T4?

+0

Không thể này là một bình luận? –

+0

@wiktor zychla, nó giải quyết câu hỏi được hỏi 'có cách nào khác' mà tôi đã trả lời –

+0

cảm ơn, tôi đã kiểm tra điều đó, cho bước này tôi đang tìm kiếm một cái gì đó mã nguồn mở và miễn phí – ePezhman

0

Chắc chắn, tôi sử dụng Razor cho tất cả việc tạo mã (và tạo email, v.v.) bằng cách sử dụng phần mở rộng đẹp RazorGenerator. Nó cho phép bạn chỉ định phần mở rộng này là "công cụ tùy chỉnh" và tạo ra lớp C# kết quả của đầu vào .cshtml mà bạn có thể gọi (và chuyển vào một @model) để chuyển văn bản thành bất kỳ đầu ra nào bạn muốn. (phần nào trớ trêu thay trong trường hợp của bạn, nó sẽ là dao cạo => chuyển đổi dao cạo)

+0

Tôi chạy dao cạo râu này ngay bây giờ, như bạn đã nói nó tạo ra từ .cshtml, tôi cần tạo ra .cshtml Tôi không cần xem trước. – ePezhman

+0

@ePezhman, nó là gì về câu trả lời của tôi mà làm cho bạn nghĩ rằng bạn không thể sử dụng kỹ thuật này để tạo ra các tập tin '.cshtml'? (đó là những gì tôi có nghĩa là "dao cạo => dao cạo chuyển đổi") –

+0

Tôi đoán razorGenerator là để làm cho xem trước dao cạo precompiled, tôi làm việc một chút với điều đó và tôi không thể nhìn thấy bất kỳ tùy chọn để có được một đầu ra .cshtml. – ePezhman

5

Tôi không chắc chắn tại sao họ sẽ chống lại việc sử dụng T4 như nhiều thư viện mã ngoài đó bao gồm Entity Framework sử dụng chúng. Nghe có vẻ như bạn đang làm một cái gì đó tôi vừa làm xong. Tôi thích sử dụng các mẫu T4 được xử lý trước để tôi có thể nạp dữ liệu vào chúng từ mã C# và tạo các tệp theo cách đó. Điều này cho phép bạn có nhiều tệp đầu ra và các tham số cơ bản để truyền dữ liệu với.

Cách tôi sử dụng nó là .. Tôi đã tạo một lớp được sử dụng để thu thập tất cả thông tin về cơ sở dữ liệu .. mà các bảng bao gồm hoặc loại trừ .. và sau đó thông tin về mỗi cột như pk hoặc danh tính không thể thực hiện được . Tôi đã cắm các mẫu t4 đã được xử lý trước của tôi với thông tin đó là có thể tạo tất cả các câu lệnh SQL, khung nhìn, mô hình, thông tin điều khiển .. và bất cứ khi nào cơ sở dữ liệu thay đổi .. tôi chỉ chạy ứng dụng giao diện điều khiển và bam tất cả được tái tạo.

preprocessed: http://odetocode.com/Blogs/scott/archive/2011/01/03/preprocessed-t4-templates.aspx

Entity Framework: http://msdn.microsoft.com/en-us/data/gg558520.aspx

MVCScaffolding: http://blog.stevensanderson.com/2011/04/06/mvcscaffolding-overriding-the-t4-templates/

T4MVC: http://mvccontrib.codeplex.com/wikipage?title=T4MVC

Một lần nữa tôi biết điều này không giúp trả lời câu hỏi của bạn nhưng T4 là tuyệt vời và tôi sẽ quan tâm để nghe các cuộc tranh luận về lý do tại sao không sử dụng T4 .. nó thậm chí được xây dựng trong!

btw đây được một số IntelliSense !: http://t4-editor.tangible-engineering.com/T4-Editor-Visual-T4-Editing.html

Nếu yo có thắc mắc xin vui lòng đánh tôi lên Tôi yêu T4 và tôi muốn được sẵn sàng để trả lời bất kỳ câu hỏi nào có thể. Đây là một ví dụ về một mẫu mà tôi sử dụng để tạo ra các mô hình POCO của mình .. rất nhiều đã được trích xuất nhờ khả năng xử lý trước của việc sử dụng các phương thức C# bình thường của tôi để truyền dữ liệu. Mẫu này tạo ra 55 mô hình cho tôi dựa trên các bảng trong cơ sở dữ liệu.

"SchemeCollector" của tôi sử dụng lớp DatabaseInfo, TableInfo và ColumnInfo mà tôi đã tạo để giữ tất cả lược đồ tôi cần. Sau đó, tôi có 9 mẫu t4 khác cũng sử dụng lớp SchemaCollector để điền dữ liệu.

Đây là tiện ích mở rộng mà tôi sử dụng để chuyển dữ liệu vào mẫu để tạo.Tôi có tất cả các thiết lập để sử dụng các tập tin XML để cấu hình cũng nhưng nó là không cần thiết Tôi chỉ muốn nó được thực sự tái sử dụng.

public partial class PocoGenerator 
    { 
     public string Namespace { get; set; } 
     public string Inherit { get; set; } 
     public DatabaseInfo Schema { get; set; } 
     public bool Contract { get; set; } 
     public string SavePath { get; set; } 
    } 

Đây là phương pháp tôi sử dụng để gọi và điền mẫu và lưu mẫu đó.

static void GeneratePoco(Config config) 
     { 
      var template = config.Poco; 
      template.Schema = config.DatabaseInfo; 

      File.WriteAllText(template.SavePath, template.TransformText()); 

      Console.WriteLine("  - POCOs generated for " + config.DatabaseInfo.DatabaseName + " complete"); 
     } 

Đây là mẫu

<#@ template debug="true" hostSpecific="true" #> 
<#@ output extension=".cs" #> 
<#@ Assembly Name="System.Core.dll" #> 
<#@ Assembly Name="System.Windows.Forms.dll" #> 
<#@ import namespace="System" #> 
<#@ import namespace="System.IO" #> 
<#@ import namespace="System.Diagnostics" #> 
<#@ import namespace="System.Linq" #> 
<#@ import namespace="System.Collections" #> 
<#@ import namespace="System.Collections.Generic" #> 
<#@ assembly name="System.Xml.dll" #> 
<#@ assembly name="System.Data.dll" #> 
<#@ import namespace="System.Data" #> 
<#@ import namespace="System.Data.SqlClient" #> 
<#@ import namespace="CodeGenerator.Utilities" #> 

using System; 
using System.Runtime.Serialization; 

namespace My.Models 
{ <# 
     List<TableInfo> tables = Schema.Tables; 
    #> 

    //######################################################################################################### 
    // This file has been generated from the tables contained in the <#= Schema.DatabaseName #> database. 
    // Changes to this file will be overwritten when the file is regenerated. Generated: <#= DateTime.Now #> 
    //######################################################################################################### 
    <# 
    foreach (TableInfo table in tables) 
    { 
    #> 

    [DataContract] 
    public class <#= table.Name #> : IConfigTable 
    { 

     <# 
     PushIndent("  "); 
      foreach (ColumnInfo col in table.Columns) 
      { 
       if(col.IsKey || col.IsIdentity) 
        WriteLine("[Key]"); 

       WriteLine("[DataMember]"); 
       if(col.IsNullable && col.Type != "string") 
        WriteLine("public " + col.Type + "? " + col.Name+ " { get; set; }"); 
       else 
        WriteLine("public " + col.Type + " " + col.Name+ " { get; set; }"); 
      }PopIndent();#>  
    } 
    <# } #> 
} 
0

Chúng tôi có nhiệm vụ tương tự, chúng ta đang đóng thùng các hình thức web động dựa trên tệp json đầu vào với định nghĩa hình thức. Trình soạn thảo chỉ định các điều khiển khác nhau sẽ được trình bày trên biểu mẫu (các điều khiển chứa các thuộc tính, hành động, trình xác nhận khác nhau). Dưới đây tôi sẽ cố gắng mô tả quy trình cơ bản về logic của chúng tôi:

  1. Deserilize và xác thực tệp json.
  2. Chuẩn bị dữ liệu sẽ được chuyển tới mẫu T4.
  3. Tạo mô hình MVC và bộ điều khiển từ dữ liệu (bước 2).
  4. Tạo các lớp bổ sung (ví dụ: một số người trợ giúp, các loại phức tạp từ mô hình).
  5. Thêm vào lắp ráp tài nguyên được nhúng như dataSources v.v., hình ảnh bất kỳ.
  6. Biên dịch tất cả nội dung ở trên.
  7. Thả dll trong thư mục mô hình.
  8. Khởi động lại trang web.

Tất cả thuộc tính trong mô hình có thuộc tính [UIHint] của chúng tôi với tên của một lượt xem một phần. Chúng tôi có khoảng 10 lượt xem một phần để biết cách thể hiện từng thuộc tính. Để hỗ trợ logic này, chúng tôi mở rộng nhà cung cấp ViewEngine và ModelMetadata.

ViewEngine tìm kiếm chế độ xem trong thư mục bổ sung. Nhà cung cấp ModelMetada thêm các thuộc tính tùy chỉnh "AdditionalValues".

điểm của chúng tôi cho một mô hình có một hàng

@Html.EditorForModel() 

Chúng tôi đã overrided Object.cshtml để xử lý 'sâu ràng buộc'. Những phần khó khăn nhất là với một bộ sưu tập mà các vật phẩm sưu tầm thuộc loại phức tạp.

Các vấn đề liên quan