2011-08-09 39 views
6

Tôi đang viết một nhà cung cấp PowerShell trong C#. Nhà cung cấp đưa ra một đối tượng miền ứng dụng thông qua một giao diện giống như ổ đĩa. Ví dụ:Trong Nhà cung cấp PowerShell, khi nào bạn làm mới và dữ liệu bộ nhớ cache?

my:\Users\[email protected] 
my:\Customers\Marty 

Dữ liệu này cuối cùng đến từ cơ sở dữ liệu.

Tôi không thể tìm thấy bất kỳ hướng dẫn tuyệt vời nào khi bạn nên truy cập vào cơ sở dữ liệu cho dữ liệu và khi nào bạn nên lưu vào bộ nhớ cache. Tôi thấy rằng PowerShell gọi các phương thức như ItemExists và GetChildNames nhiều lần; thường xuyên lặp lại cho cùng một lệnh. Không thể thực hiện cơ sở dữ liệu 5 hoặc 6 lần chỉ vì họ nhấn Tab để tự động hoàn thành, ví dụ.

Nhưng đồng thời, với tư cách là người dùng tại dấu nhắc lệnh, nếu tôi nhập Get-ChildItem (dir) và xem danh sách, sau đó làm điều gì đó bên ngoài PowerShell để tôi biết dữ liệu được làm mới. để xem bất kỳ thay đổi nào đối với cơ sở dữ liệu.

Tôi cảm thấy rằng nếu tôi biết thuật ngữ đúng để mô tả vấn đề của mình (trong cách nói PowerShell), tôi có thể trả lời hoặc tìm câu hỏi trùng lặp hiện có, nhưng tôi bị kẹt.

+3

"Có hai vấn đề khó khăn trong kỹ thuật phần mềm: đặt tên, hủy bỏ bộ nhớ cache và tắt một lỗi." – Richard

Trả lời

5

Điều này có rất ít việc phải làm với PowerShell và mọi thứ liên quan đến dữ liệu của bạn, và tầm quan trọng của nó là làm mới nó. Một lược đồ bộ nhớ đệm đơn giản sẽ sử dụng một hệ thống dựa trên thời gian, theo đó sau N phút, một yêu cầu đến lớp dữ liệu của đầu cuối của bạn sẽ kéo một bản sao mới và đặt lại bộ hẹn giờ. Có vẻ như bạn đã có ý tưởng về những quy tắc cụ thể của bạn. Tôi không nghĩ rằng hai lệnh "dir" liên tiếp nên luôn dẫn đến hai lần kéo từ cửa hàng sao lưu, nhưng bạn nghĩ như vậy cho hệ thống của bạn. Vì vậy, làm cho nó như vậy.

CẬP NHẬT

Có lẽ một nguyên tắc hướng dẫn đơn giản có thể là bạn chỉ nên làm mới dữ liệu của bạn một lần mỗi lệnh cung cấp ban hành.Danh sách các lệnh được xây dựng trong hoạt động trên các mặt hàng cung cấp bao gồm:

  • Clear-mục
  • Copy-mục
  • Get-mục
  • Invoke-mục
  • Move-mục
  • Mục mới
  • Xóa-mục
  • Đổi tên mặt hàng
  • Set-mục

Bên cạnh đó, danh sách các lệnh được xây dựng trong hoạt động trên mục nhà cung cấp tính gồm:

  • Clear-ItemProperty
  • Copy-ItemProperty
  • GET ItemProperty
  • Move-ItemProperty
  • New-ItemProperty
  • Remove-ItemProperty
  • Rename-ItemProperty
  • Set-ItemProperty

Và cuối cùng, để đọc/viết nội dung, chúng tôi sử dụng:

  • Add-Content
  • Clear-Content
  • Nhận nội dung
  • Đặt nội dung

Mỗi lệnh trong số này có phương thức tương ứng trong NavigationCmdletProvider (cho kho dữ liệu phân cấp) và đây là nơi bạn có thể muốn làm mới dữ liệu của mình. Khi triển khai các phương thức thay đổi dữ liệu mới/Move/Rename/Remove/Set/Clear và các phương thức thay đổi dữ liệu khác, bạn nên sử dụng một số phương pháp tương tranh lạc quan vì các cá thể nhà cung cấp trong PowerShell không phải là các trình đơn; có thể có một hoặc nhiều trường hợp chơi bất cứ lúc nào.

Tôi đã viết một nhà cung cấp mà hiệu lực thi hành từ kịch bản mà bạn có thể tìm thấy dễ dàng hơn để điều nguyên mẫu trong. Xem http://psprovider.codeplex.com/

Hope this helps.

+1

Hiện tại tôi đang sử dụng phương pháp dựa trên thời gian. Nhưng nó cảm thấy bị hack. Chắc chắn, có một chỉ báo thích hợp trong PowerShell để cho biết sự khác biệt giữa khi nó gọi một phương thức 5 lần trong việc thực hiện một lệnh và khi một lệnh mới hoặc đường ống mới đang chạy. –

+0

Để đưa ra một ví dụ khác. Nếu ai đó đã viết một tập lệnh .ps1 bao gồm một số tương tác với nhà cung cấp và thực hiện các công cụ hiện có ảnh hưởng đến cơ sở dữ liệu, có thể có các nhà cung cấp liên tiếp hoạt động mili giây sau mỗi khác, với các hoạt động thay đổi dữ liệu ở giữa. Có vẻ như không chuyên nghiệp khi cho rằng những người đó đã ngủ hoặc trì hoãn trong kịch bản của họ để thích ứng với tôi.Và nó cũng có vẻ sai khi đi đến cơ sở dữ liệu trên mọi phương thức của nhà cung cấp, khi các phương thức đó được gọi nhiều lần trong việc thực thi một lệnh duy nhất. Điều này, tôi đoán, là vấn đề tôi đang vật lộn với. –

+0

ok, hãy để tôi thêm một số chi tiết vào câu trả lời của tôi. – x0n

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