2012-11-07 31 views
14

Tôi gói các cuộc gọi đến một API và hầu hết các phương pháp của tôi có trong dòng đầu tiên của họ:Có điều gì đó giống như trang trí python cho C#?

if (!Gree.Authorizer.IsAuthorized()) 
{ 
    return; 
} 

Trong python tôi sẽ trang trí các phương pháp đó với một cái gì đó giống như @login_required.

Bạn sẽ sử dụng gì để cấu trúc lại loại logic đó trong c#?

Trả lời

6

Bạn đang tìm kiếm một tập hợp con của một phương pháp lập trình tổng quát hơn được gọi là Lập trình hướng Aspect.

C# có vẻ như hỗ trợ nó thông qua một số thư viện và một người cũng có thể tự mình triển khai, nhờ một số tính năng của CLR. Xem Aspect Oriented Programming using .NET bao gồm các nguyên tắc cơ bản của nó (tôi liên kết một phần của bài viết nói về các chi tiết cụ thể của C#, nhưng phần còn lại cũng không kém phần thú vị nếu bạn đang tìm kiếm các giải pháp sẵn sàng như PostSharp, như được đề cập trong câu trả lời khác).

+0

Cảm ơn bạn đã liên kết. Tôi sẽ kiểm tra nếu điều này làm việc với 'Unity3d'. – Macarse

4

Bạn có thể sử dụng bất kỳ công cụ AOP nào cho C# chẳng hạn như this một.

Với PostSharp, các nhà phát triển phần mềm có thể đóng gói thực hiện mẫu vào các lớp gọi là khía cạnh, và áp dụng những khía cạnh để mã sử dụng thuộc tính tùy chỉnh của họ.

+0

PostSharp là một '.exe'. Tôi muốn một cái gì đó để sử dụng nó từ 'Unity3d' trong đó sử dụng Mono. – Macarse

2

Tôi không quen với python nhưng có vẻ như bạn đang tìm kiếm "thuộc tính" (MSDN), (tương tự như chú thích Java).

Cụ thể, .NET cung cấp "AuthorizeAttribute", thực hiện chính xác những gì bạn muốn (và có thể nhiều hơn một chút). Trong khi bạn không dưới .NET, điều này vẫn có thể làm sáng tỏ một số trong implementatino bạn đang cố gắng đạt được.

+2

'thuộc tính' chỉ là siêu dữ liệu gắn liền với lớp/phương pháp vv và chúng không tự làm bất cứ điều gì. Bạn cần phải sử dụng một công cụ khác đọc dữ liệu meta này bằng cách sử dụng sự phản chiếu và thực hiện các công cụ cần thiết, đó là tất cả các công cụ AOP – Ankur

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