2011-01-24 27 views
7

Trong một trong các ứng dụng tôi đang làm việc, có hai chức năng cơ bản bao gồm: Tạo và Cập nhật.Thực hiện một phần phương thức trên nhiều cụm

Tuy nhiên, có một nhu cầu đôi khi thêm mã tùy chỉnh, vì vậy tôi nghĩ đến việc mở rộng mã bằng cách cho phép các bên thứ 3 để viết và nhúng mã riêng của họ:

OnCreating OnCreated OnUpdating OnUpdated

Có cách nào để cho phép trên trên nhiều hội đồng? MEF có thể giúp đỡ ở đây?

Cảm ơn bạn Trân


Cảm ơn tất cả các trả lời của bạn.

Có giao diện như vậy có nghĩa là mỗi hội đồng bên ngoài phải triển khai giao diện đó khi cần. Sau đó, mã của ứng dụng của tôi, cần phải lặp qua các assembly hiện đang chạy, phát hiện tất cả các lớp thực hiện giao diện đó và chạy các phương thức của chúng?

MEF có phù hợp ở đây không? Tôi có thể xuất khẩu thực hiện từ các hội đồng bên ngoài và nhập khẩu chúng bên trong ứng dụng của tôi?

Cảm ơn bạn Trân

Trả lời

2

Về câu hỏi MEF của bạn, bạn có thể có thể làm điều gì đó như sau để chạy các phương pháp từ một giao diện:

var catalog = new DirectoryCatalog("bin"); 
var container = new CompositionContainer(catalog); 
container.ComposeParts(); 

var plugins = container.GetExportedValues<IPlugin>(); 
foreach (IPlugin plugin in plugins) 
{ 
    plugin.OnCreating(); 
} 

Hoặc tạo một giao diện với các sự kiện như Brian Mains gợi ý:

public interface IPlugin 
{ 
    event OnCreatingEventHandler OnCreating; 
} 

sau đó mã trên sẽ giống như sau:

var catalog = new DirectoryCatalog("bin"); 
var container = new CompositionContainer(catalog); 
container.ComposeParts(); 

var plugins = container.GetExportedValues<IPlugin>(); 
foreach (IPlugin plugin in plugins) 
{ 
    plugin.OnCreating += MyOnCreatingHandler; 
} 

Tôi nghĩ rằng tôi thích thứ sau đó cho tên phương thức bạn đã chỉ định. Đối với công việc Plugin của tôi, tôi đã tạo ra một giao diện tương tự như sau:.

public interface IPlugin 
{ 
    void Setup(); 
    void RegisterEntities(); 
    void SeedFactoryData(); 
} 

Phương pháp RegisterEntities() mở rộng giản đồ cơ sở dữ liệu khi chạy, và các phương pháp SeedFactoryData() thêm bất kỳ dữ liệu mặc định (ví dụ thêm người dùng mặc định, trước dân số của bảng thành phố, v.v.).

14

Bạn không thể có lớp partical accross hội bởi vì các lớp học phần là một tính năng ngôn ngữ, và không phải là một tính năng CLR. Trình biên dịch C# kết hợp tất cả các lớp một phần vào một lớp thực, và lớp duy nhất đó là thứ duy nhất còn lại sau khi biên dịch.

Bạn có một vài lựa chọn:

  1. Offer sự kiện
  2. Tận dụng phương pháp ảo và ghi đè lên chúng
  3. Sử dụng một giao diện

Vấn đề của bạn có vẻ như nó phù hợp với các sự kiện tốt nhất. Người dùng chỉ đơn giản là có thể đăng ký với họ trong hội đồng khác.

1

Không hỗ trợ các lớp từng phần được hỗ trợ trên các cụm.

Lý do là tất cả các định nghĩa lớp từng phần được kết hợp thành một lớp duy nhất trong thời gian biên dịch. Lớp duy nhất đó nằm trong một hội đồng duy nhất.

0

Phương pháp và lớp học một phần phải nằm trong cùng một cụm. Một phần phương pháp được biên soạn ra nếu không được sử dụng. Nếu bạn cần các điểm mở rộng cho các lớp, bạn nên xem xét các phương thức hoặc sự kiện ảo.

1

Xem xét sử dụng một giao diện:

IUpdatableObject<X> 
    Creating(X obj); 
    Created(X obj); 
    Updating(X obj); 
    Updated(X obj); 

Và sau đó sử dụng giao diện này để thêm vào mã tùy chỉnh; mỗi bên thứ ba có thể triển khai giao diện này (hoặc là họ hoặc bạn có thể thông qua một trình bao bọc) và điều này có thể là một ràng buộc trong việc thêm logic nghiệp vụ tùy chỉnh.

HTH.

+0

bất kỳ mẫu đầy đủ nào có mã nguồn đầy đủ về nó? – Kiquenet

1

Bạn (hoặc người sử dụng) có thể sử dụng phương pháp khuyến nông: http://msdn.microsoft.com/en-us/library/bb383977.aspx

+0

Bạn có thể giải thích cách các phương pháp mở rộng hữu ích ở đây không? Tôi không nghĩ rằng họ giúp với loại điểm mở rộng mà OP cần. – CodesInChaos

+1

Bạn đã chính xác. Câu trả lời này chỉ là một thay thế cho partials trên hội đồng. Sự kiện là cách tốt nhất cho vấn đề ban đầu. – r03

0

lớp một phần qua hội không được hỗ trợ bởi vì các khái niệm đằng sau lớp một phần là để cho phép nhiều nhà phát triển góp phần phương pháp và các thành viên khác nhau cho cùng một lớp dưới một không gian tên cụ thể.
Điều này được thực hiện để giúp các nhà phát triển đồng bộ mã vào một lớp duy nhất, bên trong một assembly, xây dựng sau khi biên dịch.

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