2012-12-12 25 views
6

Tôi đang viết thư viện tùy chỉnh sử dụng ServiceStack.Text nội bộ. Các thư viện khác tiêu thụ của tôi cũng có thể sử dụng ServiceStack.Text.Có thể chỉ định các cài đặt ServiceStack.Text.JsConfig thành thư viện của bạn không?

tôi muốn thay đổi một số tùy chọn JsConfig (đặc biệt là xử lý ngày), nhưng, giống như bất kỳ công dân tốt, tôi không muốn thay đổi của tôi về những giá trị đó để gây tác dụng phụ cho người tiêu dùng của mình.

Thật không may JsConfig là một lớp tĩnh, vì vậy các thiết lập của nó là tĩnh, và sẽ chảy máu cho người tiêu dùng khác của ServiceStack trong cùng một AppDomain tôi tin. Đó là một hành vi không mong muốn.

Có cách nào để phạm vi thay đổi cấu hình của tôi chỉ với các cuộc gọi của tôi đến JsonSerializer không?

Cập nhật

tôi nhận ra có phương pháp JsConfig.Reset, không may nếu người gọi đã tùy chỉnh nó đã có, đó sẽ bị mất.

Tôi có thể lưu các giá trị và khôi phục chúng, nhưng tôi sẽ phải đồng bộ hóa quyền truy cập vào bộ nối tiếp, điều này cũng đánh bại mục đích.

Hy vọng rằng có điều gì đó đơn giản tôi bị thiếu?

Trả lời

14

Chức năng này bị thiếu trong ServiceStack.Text vì vậy tôi đã thêm pull request cho nó.

Về cơ bản bây giờ nếu bạn muốn phạm vi thiết lập cấu hình của bạn, bạn có thể sử dụng cú pháp sau:

using(var config = JsConfig.BeginScope()) 
{ 
    config.DateHandler = ... 
} 

Và các giá trị sẽ không còn được đặt một lần khối sử dụng đi ra khỏi phạm vi, nó ThreadStatic cũng vì vậy sẽ không ảnh hưởng đến các chủ đề khác.

1

Một khả năng tôi đã sử dụng là chỉ sử dụng loại tùy chỉnh bên trong thư viện của tôi làm đối tượng gốc để tuần tự hóa và sau đó chỉ định các giá trị JsConfig riêng cho điều đó.

internal class MyInternalObject { } 

JsConfig<MyInternalObject>.DateHandler = ... 

Tôi không chắc liệu các giá trị cấu hình gốc có truyền xuống đối tượng con trong tuần tự hóa hay không, nhưng dễ dàng để kiểm tra.

+3

Thật không may 'DateHandler' không có trên phiên bản chung của loại này, vì vậy điều này sẽ không hoạt động. –

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