2012-08-04 8 views
14

Tôi hiểu C# Code Fragments và .NET Assemblies cung cấp chức năng tương tự cho việc phát triển mẫu mô-đun. Chúng tôi quản lý các đoạn mã trong CME và mã lắp ráp trong Visual Studio, nhưng sử dụng cả hai cách tương tự trong Trình tạo mẫu.Sự khác biệt giữa các đoạn mã C# và TBB lắp ráp là gì?

Về mã, tôi có thể tạo ra một C# Mã Fragment Template Building Block (TBB), ví dụ:

var timeStamp = DateTime.Now.ToString("d MMM yyyy"); 
package.PushItem("timeStamp from fragment", package.CreateHtmlItem(timeStamp)); 

Tôi cũng có thể tạo ra một assembly .NET Template Building Block sử dụng cùng mã bằng cách thực hiện ITemplate như dưới đây.

using System; 
using Tridion.ContentManager.Templating; 
using Tridion.ContentManager.Templating.Assembly; 

namespace CreateAndBreakTemplates 
{ 
    [TcmTemplateTitle("Add Date to Package")] 
    public class AddDateToPackage : ITemplate 
    { 
    public void Transform(Engine engine, Package package) 
    { 
     var timeStamp = DateTime.Now.ToString("d MMM yyyy"); 
     package.PushItem("timeStamp from assembly", 
         package.CreateHtmlItem(timeStamp)); 
    } 
    } 
} 

Các docs giải thích rằng "SDL Tridion chèn đoạn mã trong phương pháp xác định trước của một lớp được xác định trước." Có vẻ như lớp này triển khai ITemplate và thêm một số tham chiếu bên dưới (tôi có thiếu gì không?).

assembly setup instructions đề cập đến ít nhất các dll này.

  • Tridion.Common.dll
  • Tridion.ContentManager.dll
  • Tridion.ContentManager.Templating.dll
  • Tridion.ContentManager.Publishing.dll

Bất kỳ sự khác biệt khác giữa mảnh và lắp ráp và làm thế nào bạn sẽ lựa chọn giữa hai?

Trả lời

16

Một đoạn C# được biên dịch thành một assembly bằng Tridion khi mẫu được gọi đầu tiên và sau khi nó được sửa đổi.Để biên dịch đoạn, Tridion quấn nó trong một số "thay đồ trong hầm ngục" (điểm thưởng cho những ai biết nơi hạn xuất phát từ) rằng:

  1. Sử dụng Tridion.ContentManager, Tridion.ContentManager.CommunicationManagement, Tridion.ContentManager.ContentManagementTridion.ContentManager.Templating namespace
  2. Làm cho PackageEngine có sẵn trong các lĩnh vực được gọi là packageengine tương ứng
  3. Tạo một logger cho # fragment C đó là có sẵn thông qua một lĩnh vực được gọi log
  4. Thêm tham chiếu đến một số hội đồng thường được sử dụng (nhưng không thêm một using cho không gian tên của họ được nêu ra)

Edit: cho câu trả lời khác có vẻ như nhiều người không biết làm thế nào để thực hiện một số nhiệm vụ trong C# fragment TBBs, vì vậy tôi sẽ ghi lại chúng dưới đây:

nhập thêm namespace

Để nhập/sử dụng không gian tên bổ sung vào # fragment C, bạn cần t o sử dụng cú pháp sau:

<%@ Import Namespace="Tridion.ContentManager.ContentManagement.Fields" %> 

Lưu ý rằng điều này sẽ chỉ namespace nhập khẩu từ hội mà đã được tham chiếu bởi Tridion. Không có cơ chế để bạn thêm tham chiếu đến các assembly khác một cách rõ ràng; vì vậy nếu bạn cần một DLL của bên thứ ba, bạn sẽ cần phải thêm nó vào GAC.

chức năng tùy chỉnh Xác định

Bạn có thể xác định các lĩnh vực tùy chỉnh và chức năng trong # fragment C của bạn bằng cách sử dụng cú pháp sau:

<%! 

public static string GetDate() 
{ 
    return new DateTime().ToString("u").Replace(" ", "T"); 
} 

%> 

Xác định các trường thành viên và (lồng) lớp

Cú pháp để xác định các chức năng tùy chỉnh cũng cho phép bạn xác định các lớp lồng nhau và/hoặc các trường thành viên:

<%! 

public class MyLittleHelper 
{ 
    public MyLittleHelper(string param1) 
    { 
    } 
} 

%> 
+0

Giải thích tuyệt vời và một số ví dụ hay, nhưng vẫn còn một câu hỏi. Tại sao (hoặc nên) bạn (không) sử dụng các đoạn C#? –

+0

Tôi thấy rằng những người khác đã trả lời lý do của họ, vì vậy thay vào đó quyết định tập trung giải thích cách các đoạn C# hoạt động và cách bạn có thể thực hiện những điều nhất định với chúng. Tôi thường viết khá một vài đoạn C#, vì chúng không có điều kiện tiên quyết, điều này đảm bảo *** mọi người *** có thể sử dụng chúng. –

+0

Tôi thấy phần "cách chọn" được trả lời trong các câu trả lời khác cũng như trong câu trả lời kỹ lưỡng và chi tiết (và cập nhật) của Frank. Về cơ bản, chúng tôi tự do lựa chọn giữa chức năng phân đoạn C# này so với những gì Visual Studio và một hội đồng cung cấp. Tôi biết về việc nhập khẩu, nhưng không nhận ra rằng chúng tôi có quyền truy cập vào 'nhật ký' cũng như cách xác định các chức năng tùy chỉnh. 1 và chấp nhận cho "trục xuất" một số phép thuật màu đen _voodoo xung quanh C# mảnh - dễ dàng hơn nhiều để đưa ra quyết định sáng suốt với sự rõ ràng này. –

8

Frank đã giải thích sự khác biệt giữa hai cách tiếp cận, nhưng điều đó vẫn để lại câu hỏi về cách chọn giữa hai phương pháp này. Tư vấn cá nhân của tôi là không bao giờ sử dụng các đoạn C# cho bất cứ điều gì, chỉ với một ngoại lệ *. Như bạn đã phát hiện ra, có một số ma thuật đen tối xảy ra trong họ mà cá nhân tôi không thích. Ngoài ra, có quá nhiều thứ bạn không thể làm trong đó mà một lập trình viên .NET khá thích, chẳng hạn như tạo các lớp.

Đưa hương vị cá nhân của tôi sang một bên, tôi chỉ thấy một lý do tại sao bạn sẽ bao giờ nghỉ đến các đoạn C#: nếu bạn không có quyền truy cập vào Visual Studio hoặc công cụ khác xây dựng DLL. Và đó không phải là một lý lẽ rất mạnh mẽ: nếu bạn muốn một công việc làm, bạn sẽ có được những công cụ thích hợp!

* Ngoại lệ là các đoạn C# mà Tridion tự động tạo cho mỗi ITemplate trong assembly của bạn, tất nhiên.

+1

+1 để nhấn mạnh vào việc sử dụng các công cụ thích hợp và để cảnh giác với các đoạn C#. Tôi cũng nghĩ rằng khá nhiều việc sử dụng hợp lý duy nhất là để bootstrap một mẫu lắp ráp. Tuy nhiên, bạn chỉ có thể tạo ra các lớp, miễn là chúng là thành viên của lớp mà Tridion kết thúc vòng mã của bạn –

+0

@Dominic See, tôi thậm chí không biết rằng vì tất cả những thứ voodoo đó :) – Quirijn

+2

Trong khi Tôi đồng ý rằng bạn thường nên sử dụng các hội đồng chứ không phải các mảnh C#, các mảnh vỡ có sử dụng của chúng. Chúng dễ dàng cập nhật và chia sẻ hơn. Chúng cũng rất nhanh. Vì vậy, nếu tất cả những gì bạn từng viết là một số dòng để đẩy thứ gì đó vào trong gói, tôi sẽ tạo ra một mảnh. Tuy nhiên, tôi coi chúng là ngoại lệ đối với quy tắc. –

2

Tôi sẽ không bao giờ sử dụng các đoạn C# vì lý do duy nhất khiến nó quản lý mã của bạn khá khó khăn và bạn cần triển khai thủ công chúng.Và nếu bạn viết mã của mình từ Visual Studio, thì bạn nên tạo một assembly .NET Building Block.

8

Sự khác biệt chính giữa C# mã Fragment và .net Assemblies theo quan điểm của tôi được phân loại thành các nhóm cấp cao hơn.

Step-by-Step Debugging

Với cụm .net bạn có thể làm từng bước gỡ rối từ visual studio nơi như mảnh Mã C# nó không phải là có thể.

Re-Sử dụng hoặc cơ sở Lớp

Với cụm .net bạn có thể mở rộng ITemplate để tạo ra một cái gì đó giống như BaseTemplate và tất cả các mẫu của bạn có thể mở rộng chúng để bạn có mẫu thiết kế thông thường, nơi như C# không có khái niệm của BaseTemplate ngoài giao diện Tridion ITemplate.

Với các hội đồng .net bạn có thể thêm các lớp tiện ích chung (thường là TridionUtilities) và tất cả các mẫu của bạn đều tham chiếu đến cùng một TridionUtilities cho chức năng chung. Đoạn mã C# các hàm tiện ích cần phải được định nghĩa trong cùng một TBB và không thể được tái sử dụng với các TBB khác trừ khi bạn tạo một lớp và triển khai tới GAC.

Dễ dàng nâng cấp và bảo trì Quét

Với cụm .net nó là dễ dàng hơn để làm bất cứ quét nâng cấp như API không/Phương pháp đơn giản đề cập đến khuôn khổ dlls/.net mới. .net assembly giúp dễ dàng xác định các tác động tiềm tàng lên việc lên kế hoạch nâng cấp Tridion hoặc nâng cấp khung .net. C# đoạn mã nó là khó khăn hơn nhiều để tìm thấy những phản đối hoặc bất kỳ tác động của nâng cấp.

phát triển thân thiện

hội Rõ ràng .net đang phát triển sử dụng Visual Studio (nhà phát triển yêu nó!) Vs C# Mã Những mảnh vỡ trong một Text Editor (đau đớn).

Khi tôi bắt đầu quay trở lại với Tridion 5.3, bắt đầu với các đoạn mã C# và nhanh chóng nhận ra những sai lầm mà tôi đã thực hiện cho việc không tham gia .net assembly.

Phiếu bầu của tôi luôn là hội đồng .net và đoạn mã C# không được xem xét trừ khi tôi không có lựa chọn. lol ..

6

Tôi nghĩ rằng sự khác biệt thực sự được giải thích tốt nhất bởi câu trả lời của Frank, về cách bạn chọn giữa hai người. Tôi thường nói, vì bạn đang sử dụng Visual Studio anyways, luôn luôn tạo ra một hội đồng quản trị. NETB cho mã của bạn. Chúng cung cấp cho bạn nhiều lợi ích hơn như bao gồm các hội đồng bên thứ 3, cho phép mã hóa đúng với các lớp và phương thức dễ dàng hơn và có lẽ quan trọng nhất, cho phép gỡ lỗi thích hợp (mặc dù điều này có thể khó thiết lập tùy thuộc vào bạn đang ở đâu, suy nghĩ của môi trường khách hàng, tường lửa, v.v.).

Có cho tôi chỉ có hai trường hợp ngoại lệ cho việc sử dụng C# Những mảnh vỡ:

  1. Các tài liệu tham khảo đến các lớp học thực hiện ITemplate trong một hội đồng, cho phép bạn sử dụng các như TBBs riêng
  2. Nếu có một yêu cầu để quản lý hằng số hoặc các hằng số mã hóa khác trực tiếp từ SDL Tridion

Số 2 là tất nhiên, nhưng bạn không bao giờ có thể thực hiện mà không có cấu hình đặc tính của TBB. mes nó chỉ là dễ dàng hơn rất nhiều, để trực tiếp viết chúng trong một mảnh C# và có đẩy chúng vào gói cho các TBBs khác để sử dụng.

Trong buổi huấn luyện của tôi, tôi thường nhắc đến câu chuyện sau đây là lần duy nhất mà tôi từng chọn để sử dụng một C# Fragment TBB cho đến nay, cho thấy bao nhiêu một ngoại lệ đó là sử dụng chúng:

Tôi đã làm việc ở một khách hàng ở nước ngoài, và taxi của tôi cho sân bay đã rời đi trong 10 phút khi một trong những nhà phát triển tôi đang huấn luyện hỏi tôi một câu hỏi về cách lấy danh sách các mục từ một Thư mục trong TBB của mình. Tôi đã đóng Visual Studio và Outlook của tôi và sắp tắt máy tính xách tay của tôi, nhưng nhanh chóng duyệt qua một số mẫu mã của tôi để tìm thấy những gì anh cần. Biết rằng bắt đầu lên Visual Studio hoặc Outlook sẽ mất một vài phút, tôi nhanh chóng dán mã trong một mảnh C# vì vậy ông đã có nó để tham khảo dễ dàng.

+1

Tôi sẽ thêm "khi bạn có ít hơn 10 phút và Visual Studio được đóng" vào danh sách tiêu chí của tôi để xem xét C# Fragments. ;-) –