2012-02-08 29 views
5

Tôi đã xây dựng một đối tượng tĩnh nhỏ để lưu các kiểu generic thành Isolated Storage trên WP7. Điều này làm việc lớn cho các dự án cũ nhưng một số dự án mới sử dụng DI để quản lý cấu hình. Tôi là một fan hâm mộ của DI vì nó có nghĩa là tôi có thể thay đổi cấu hình ở một nơi và có nó lọc xuống tất cả các phụ thuộc.Là một trình bao bọc thể hiện xung quanh một lớp tĩnh với mục đích của một mẫu chống DI?

Suy nghĩ của tôi là tạo một vùng tên được gọi là Tiêm và bọc đối tượng này trong một cá thể có giao diện để tôi có thể tiêm nó. Nó cũng sẽ cho phép tôi trao đổi bộ xử lý lưu trữ cho những người yêu cầu triển khai cụ thể hơn.

Đây có phải là thực tế phổ biến hoặc đây có phải là mô hình chống không?

Lưu ý, tôi muốn giữ tùy chọn tĩnh vì không phải ai cũng cần hoặc có thể sử dụng DI. Tôi chỉ đơn giản là cố gắng để kích hoạt cả hai với số tiền ít nhất của sao chép.

+1

Tôi sử dụng cách tiếp cận tương tự để đóng gói các cuộc gọi đến 'Tệp' hoặc các lớp/phương thức tĩnh khác. Vì vậy: Không, tôi không coi đây là một mẫu chống. –

Trả lời

8

Bạn thấy điều này mọi lúc. Chủ yếu là nó để làm việc xung quanh mã di sản mà đã được tĩnh hoặc niêm phong hoặc không thực hiện bất kỳ giao diện. Trong khi một lớp cơ sở thay vì một giao diện, HttpContextBase là ví dụ nổi bật nhất mà tôi có thể nghĩ đến.

Vì bạn muốn giữ tùy chọn tĩnh, về cơ bản là tình huống hiện tại của bạn, vì vậy hãy tiếp tục và thực hiện. Tuy nhiên, tôi sẽ không tạo ra một không gian tên Injection, vì tên đó nói nhiều về cơ chế hơn là vai trò của đối tượng phát.

Bạn không viết chính xác cách lớp là tĩnh, nhưng tôi giả định rằng chúng ta đang nói về một lớp tĩnh với phương thức tĩnh.

Một giải pháp hơi thanh lịch hơn (nếu bạn có thể thay đổi lớp học một chút) là biến lớp tĩnh thành Singleton. Sau đó, nó có thể là tĩnh và thực hiện các giao diện cùng một lúc:

public class Foo : IFoo 
{ 
    private readonly static Foo instance = new Foo(); 

    private Foo() { } 

    public static Foo Instance 
    { 
     get { return Foo.instance; } 
    } 

    // IFoo member: 
    public void InterfaceFoo() 
    { 
     Foo.LegacyFoo(); 
    } 

    public static void LegacyFoo() 
    { 
     // Implementation goes here... 
    } 
} 

Tôi nghĩ rằng refactoring chỉ cần thiết để đi đến một giải pháp như vậy là làm cho chính lớp bê tông và làm cho nó thực hiện các giao diện như một Singleton.

khách hàng cũ vẫn có thể truy cập vào các phương pháp của nó bằng cách gọi Foo.LegacyFoo();

+1

Có thể một thuộc tính tĩnh được gọi là _Current_ sẽ tốt hơn một phương thức. –

+0

Cảm ơn, thư viện chỉ mới vì vậy nó không có những điều kiện tiên quyết như vậy. Lý do làm cho đối tượng tĩnh là dễ sử dụng cho những người không thích/muốn tiêm phụ thuộc. Một singleton dường như là một đề xuất hấp dẫn hơn vì nó giải quyết một vấn đề khác xung quanh các lớp tĩnh không thể sử dụng các giao diện. – deanvmc

+1

@ Matías Fidemraizer: Có một thuộc tính tĩnh gọi là 'Instance' - đó là cấu trúc giống nhau. Tôi không nghĩ từ 'Hiện tại' là tốt ở đây, vì nó ngụ ý rằng Singleton có thể thay đổi khi thời gian trôi qua. –

1

Theo ý kiến ​​của tôi, tôi muốn để chứa dependency injection quyết định nếu nó là thoáng qua hay singleton - Tôi không biết những gì khuôn khổ bạn đang sử dụng đã có, nhưng hầu hết trong số họ nên kiểm soát vòng đời của phụ thuộc -.

Và các ứng dụng tiêm phụ thuộc trước có thể duy trì một phiên bản tĩnh của đối tượng này như là một phần của một số ứng dụng quản lý nhà nước.

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