Tôi có những gì tôi nghĩ là một "vấn đề" đơn giản mà tôi đã tìm thấy một vài giải pháp nhưng tôi không chắc chắn cách nào để đi và thực hành tốt nhất trong C#.C# :: Khi nào nên sử dụng các sự kiện hoặc tập hợp các đối tượng bắt nguồn từ một giao diện xử lý sự kiện?
Tôi có một đối tượng chính (nói một singleton) được instanciated một lần trong suốt tuổi thọ của ứng dụng. "MasterClass" này tạo ra một loạt các loại đối tượng mới, nói "SlaveClass" mỗi khi MasterClass.Instance.CreateSlaveObject được gọi.
MasterClass này cũng giám sát một số đối tượng khác để thay đổi trạng thái và khi điều đó xảy ra, thông báo cho đối tượng SlaveClass mà nó tạo ra thay đổi. Có vẻ đơn giản là đủ.
Kể từ khi tôi xuất phát từ nguồn gốc C++ trên thế giới, cách tôi đã làm nó đầu tiên nó có một giao diện
Interface IChangeEventListener
{
void ChangeHappened();
}
từ mà tôi có nguồn gốc "SlaveClass". Sau đó, trong "MasterClass" của tôi, tôi có:
...
IList<IChangeEventListener> slaveList;
...
CreateSlaveObject
{
...
slaveList.Add(slave);
}
...
ChangeHappened()
{
...
foreach(var slave in slaveList)
{
slave.ChangeHappened();
}
}
Và tính năng này hoạt động. Nhưng tôi cứ tự hỏi trong tâm trí của tôi nếu có một cách khác (tốt hơn) để làm điều này. Vì vậy, tôi đã nghiên cứu thêm một chút về chủ đề và thấy các sự kiện C#. Vì vậy, thay vì duy trì một bộ sưu tập của nô lệ trong MasterClass, tôi về cơ bản sẽ tiêm MasterClass vào ctor của SlaveClass (hoặc thông qua một tài sản) và để cho đối tượng SlaveClass thêm nó ChangeHappened như một xử lý sự kiện. điều này sẽ được minh họa:
...Master...
public delegate void ChangeHappenedDelegate(object sender, NewsInfoArgs args);
public event NewUpdateDelegate ChangeHappenedEvent;
....
public SlaveClass (MasterClass publisher) //inject publisher service
{
publisher.ChangeHappenedEvent += ChangeHappened;
}
Nhưng điều này có vẻ là giống như một khớp nối un-cần thiết giữa các Slave và Master, nhưng tôi thích sự sang trọng của các cơ chế thông báo sự kiện xây dựng-in cung cấp.
Vì vậy, tôi có nên giữ mã hiện tại của mình hoặc chuyển sang phương pháp tiếp cận dựa trên sự kiện (với nhà xuất bản tiêm) không? và tại sao?
Hoặc nếu bạn có thể đề xuất giải pháp thay thế tôi có thể đã bỏ lỡ, tôi cũng sẽ đánh giá cao điều đó.
Gọn gàng! Tôi thực sự thích cách tiếp cận bạn đề xuất của MasterClass để chăm sóc sự kiện hooking, nhưng giữ cơ chế sự kiện :) Vấn đề tôi thấy là như bạn đã hỏi, không có gì đảm bảo rằng Slave sẽ sống miễn là Master ... vì vậy nếu tôi muốn hủy bỏ sự kiện trong trình phá hủy Slave, tôi sẽ mang lại khớp nối:/ – Futurist
Vâng, có một sự thay thế, hãy để tôi thay đổi câu trả lời của tôi. –
Cảm ơn bạn đã trả lời độc lập. Tôi sẽ suy nghĩ về điều này vì có một số khái niệm (như suy yếu) vẫn còn xa lạ với tôi. – Futurist