2010-02-19 30 views
5

Tôi có một lớp tĩnh chứa logic cơ sở dữ liệu của mình.Làm cách nào để lớp tĩnh của tôi không tĩnh?

Lớp này được sử dụng trong trang web, dịch vụ web và là một phần của thành phần phần mềm trung gian.

Đối với mọi phương thức trong lớp này, tôi cần một phần thông tin ngữ cảnh từ người gọi. Trong trường hợp trang web này sẽ là thông tin người dùng, đối với dịch vụ web và thành phần phần mềm trung gian, điều này sẽ xác định dịch vụ gọi điện.

Tôi không thể lưu trữ giá trị này trong cấu hình vì điều này có thể khác nhau cho mỗi người dùng và tôi không luôn có httpcontext để nhận được điều này.

Tôi có thể dễ dàng thêm tham số mới vào mọi phương thức trong lớp này hoặc tôi có thể thay đổi nó từ một lớp tĩnh để nó có một thuộc tính không tĩnh nhưng không có giải pháp nào có vẻ rất thanh lịch.

Vì vậy, có bất kỳ tùy chọn nào khác mà tôi chưa xem xét không?

+3

danh hiệu tuyệt vời^^ "làm thế nào để tôi làm cho singleton của tôi không quá singleton" – tanascius

+0

@tanascius - vô giá +1 gây ra thats tất cả tôi có thể cung cấp cho. @chris, bạn có thể muốn suy nghĩ lại chiến lược của mình. Trong một tuyên bố chăn chung chung tôi sẽ nói 'DAL tĩnh là yêu cầu cho rắc rối'. .2 peso. –

+0

@Sky Sanders - tách lông ở đây nhưng DAL là linq để sql lớp học, đây là logic cơ sở dữ liệu của tôi mà ngồi trên đầu trang của điều đó. Bỏ qua thực tế là tôi đã chấp nhận câu trả lời và đi xuống tuyến đường không tĩnh, bạn có thể đủ điều kiện tuyên bố "yêu cầu sự cố" của mình không? Tại sao lớp tĩnh lại là một ý tưởng tồi? –

Trả lời

6

Nếu tất cả các phương pháp cần một số trạng thái, nó có vẻ giống như bạn nên tạo một cá thể và chuyển trạng thái đó thông qua hàm tạo.

Thay đổi thiết kế từ một loạt các phương thức tĩnh thành một thể hiện cũng sẽ giúp bạn dễ dàng kiểm tra lớp hơn.

+0

Tôi càng nghĩ về điều đó, tôi càng nghĩ đến ý tưởng này. Nhược điểm duy nhất là dòng mã bổ sung cần thiết mỗi khi có yêu cầu gọi phương thức. –

+0

+1 - đây là trường hợp điển hình cho tiêm phụ thuộc/IoC (thủ công hoặc thông qua một khung chứa). Xem thêm http://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052 – TrueWill

+0

Bạn có tạo cá thể cho mỗi cuộc gọi không? Nếu không, tôi không thấy làm thế nào bạn sẽ cần thêm mã bằng cách sử dụng một thể hiện. –

1

Tôi sẽ thêm thông số. Nó không có vẻ không phù hợp với tôi - bạn cần thông tin ngữ cảnh, và cách duy nhất để có được nó trong một lớp tĩnh là bằng cách chuyển nó vào một lớp tĩnh là bằng cách chuyển nó vào.

+1

vấn đề với điều này là có vẻ như không phải là DRY với tôi. –

+0

Tôi không thấy điều này là vi phạm DRY, nhất thiết. Cho dù bạn giữ lớp tĩnh hay chuyển sang tạo các cá thể, các phương thức đó sẽ cần thông tin ngữ cảnh. Họ sẽ lấy nó từ một tham số hoặc từ một thành viên thể hiện - dường như tôi không phải là vấn đề. Đối với một lớp là một phần của phần mềm trung gian db của bạn, và không phải là một phần của bối cảnh của bạn, tôi nghĩ rằng một lớp tĩnh là thích hợp hơn. Ngoài ra, nếu lớp tĩnh của bạn là rất lớn, và dữ liệu ngữ cảnh của bạn là rất nhỏ, tôi sẽ giữ cho lớp tĩnh. – Ray

+0

mọi phương thức đều sử dụng phương pháp riêng để thiết lập kết nối. Đó là ở đây tôi đang sử dụng các thông tin ngữ cảnh để mỗi phương pháp không "trực tiếp" sử dụng bối cảnh nếu bạn đánh giá cao sự khác biệt tinh tế? Có tham số này trên mọi phương thức và sau đó chuyển nó qua phương thức riêng tư có vẻ như lặp lại với tôi. –

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