2012-09-20 25 views
5

Tôi chắc chắn đây là một yêu cầu rất lạ, nhưng ở đây đi.Làm cách nào để tạo một lớp C# có thể tải xuống từ bên trong trang web ASP.NET MVC?

Chúng tôi có một số mã cấu hình khách hàng được đại diện bởi các lớp C# mà chúng tôi biên dịch thành một thư viện lớp. Tạo các lớp cấu hình này hiện là công việc của khỉ mà tôi muốn gán cho một người nào đó không phải là một nhà phát triển. Do đó, chúng tôi xây dựng trang web "Trình cấu hình" mà nhà phân tích nghiệp vụ có thể sử dụng để tạo các lớp C# hợp lệ bằng cách điền vào biểu mẫu với các tùy chọn có liên quan được chọn.

Cách tốt nhất để tạo lớp C# từ mẫu trong trang web MVC là gì? Lưu ý rằng tôi không nói ở đây về việc tạo động và thực thi một lớp khi chạy: chúng tôi chủ yếu tạo ra một tệp văn bản chỉ chứa mã C# sẽ được đưa vào một dự án hoàn toàn khác.

Điều này chứng tỏ là một chủ đề rất khó khăn đối với google đúng cách! Tùy chọn mà đã đưa ra cho đến nay ...

  • chỉ cần sử dụng một file văn bản tokenized và thay thế các giá trị sử dụng String.Format
  • bằng cách nào đó sử dụng Razor như một công cụ khuôn mẫu (nhưng không chắc chắn như thế nào, và nó không phải html chúng tôi 'tạo lại)
  • bằng cách nào đó sử dụng các mẫu T4 (ít nhất tôi biết nó được sử dụng để tạo ra C#, nhưng không chắc chắn làm thế nào để thực hiện trong thời gian chạy)

Bất kỳ ý tưởng về cách tốt nhất để tiếp cận này?

Theo yêu cầu, đây là ví dụ về lớp/tệp đầu ra. Giá trị ở đây ghi đè các giá trị được đặt trong lớp cơ sở có nhãn, xác thực của khách hàng cụ thể, v.v. Đây là cách chúng tôi tùy chỉnh sản phẩm của mình cho khách hàng.

public class AreaRiskTemplate: AreaRiskTemplateBase 
{ 
    public override string EntityName { get { return "risk"; } } 
    public override string EntityNamePlural { get { return "risks"; } } 
    public override string EntityNameArticle { get { return "a"; } } 
    public override string CGovItemRefPrefix { get { return "R"; } } 
    public override void SetFieldDefinitions() 
    { 

     FieldDefinitions.Level1.IsImplemented = true; 
     FieldDefinitions.Level1.Label = "Category"; 
     FieldDefinitions.Level1.IsVisibleInGrid = true; 

     FieldDefinitions.Level2.IsImplemented = true; 
     FieldDefinitions.Level2.Label = "Team"; 
     FieldDefinitions.Level2.IsVisibleInGrid = true; 

     FieldDefinitions.Description.IsImplemented = true; 
     FieldDefinitions.Description.Label = "Description"; 
     FieldDefinitions.Description.IsVisibleInGrid = true; 

    } 
    public override ModelStateDictionary Validate() 
    { 
     var msd = new ModelStateDictionary(); 
     // add template-specific validation here 
     msd.Merge(base.Validate()); 
     return msd; 
    } 
    public override List<string> Level1Options 
    { 
     get 
     { 
      return new List<string> 
       { 
        "Organisational", 
        "Financial", 
        "Operational", 
        "External", 
      "IT" 
       }; 
     } 
    } 
} 

Cập nhật: hiện đang điều tra mẫu T4 tại http://msdn.microsoft.com/en-us/library/ee844259(v=vs.100).aspx (nhờ nhận xét bên dưới). Trông đầy hứa hẹn.

+1

http://msdn.microsoft.com/en-us/library/bb126445.aspx dường như bao gồm chi tiết về việc bắt đầu với T4 khi chạy. –

+0

Điều này cũng có thể quan tâm: http://code.msdn.microsoft.com/windowsdesktop/Single-File-Generator-94d856d4 – Magrangs

+0

Bạn có thể đăng một ví dụ về tệp cấu hình này như thế nào không? –

Trả lời

1

Tôi khuyên bạn nên tránh trang web và thay vào đó chỉ cần đi với CodeSmith. Bạn có thể thiết kế các kịch bản CodeSmith để nó sẽ yêu cầu thông tin và sau đó tạo mã yêu cầu. Có vẻ như ít công việc hơn nhiều, mặc dù bạn phải mua CodeSmith.

+0

Cảm ơn bạn đã đề xuất. Tôi đã sử dụng Codesmith khá một chút trong quá khứ. Tôi đoán vấn đề của tôi là trong trường hợp này tôi muốn người phi kỹ thuật nhập dữ liệu cho phép tạo ra các lớp. Sau đó, nhà phát triển sẽ đăng nhập và tải xuống các lớp dựa trên dữ liệu đó. Nó khá có thể là phạm vi của Codesmith đã thay đổi trong hơn 5 năm kể từ lần cuối tôi chơi với nó, nhưng tôi nghĩ rằng nó thiếu mất giao diện nhập. – centralscru

+1

@centralscru - CodeSmith cho phép bạn tạo một hộp thoại chấp nhận các tham số được sử dụng trong thế hệ. Người dùng cuối chỉ chạy tập lệnh, điền vào các ô và nhấp vào ok. Sau đó, bạn có thể lưu các lớp được tạo ra đó vào một chia sẻ UNC. –

0

Phương pháp thực hiện điều này với chi phí thấp nhất sẽ là sử dụng được xây dựng của Microsoft trong CodeDOM API. Nó cho phép bạn xây dựng và thao tác các tài liệu mã CLR với mô hình đối tượng tài liệu tương thích chéo.

Nhược điểm duy nhất của phương pháp này là không rõ ngay cách thực hiện một số tính năng cụ thể của ngôn ngữ. Một ví dụ là các trường C# readonly, vì chúng không có sẵn trong mọi ngôn ngữ CLR, nhưng chỉ có trong C#. Giải pháp cho sự phức tạp đặc biệt này là sử dụng CodeSnippet và chèn mã thủ công làm chuỗi. Các vấn đề phức tạp khác phức tạp hơn có thể được giảm thiểu bằng cách tích hợp CodeDOM với một công cụ tạo khuôn mẫu. Oleg Sych đã viết a useful article on integrating CodeDOM with the T4 templating engine. Tôi thích cách tiếp cận này với cách tiếp cận tạo văn bản thuần túy, bởi vì một mô hình đối tượng tài liệu được đánh máy mạnh là ít lỗi hơn so với văn bản thuần túy.

Ngoài ra, nếu bạn đã từng thực hiện di chuyển để muốn mã đầu ra được biên dịch, điều này cũng được hỗ trợ bởi API CodeDOM.

Nếu đây là một thực tế mà bạn nghĩ rằng bạn có thể sử dụng rất nhiều, bạn có thể muốn bọc một số chức năng thao tác DOM phổ biến vào các cuộc gọi phương thức thông thạo bằng cách sử dụng builder pattern. Tôi đã xây dựng một thư viện cá nhân sử dụng cách tiếp cận này và nó đã rất thành công trong việc tăng năng suất của tôi thông qua việc tạo mã.

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