2013-08-06 47 views
14

Đây là điều mà tôi đã mulling trong khi tạo ra một ứng dụng AngularJS. Khi lần đầu tiên tôi học được về nhà máy AngularJS, tôi nghĩ một cách sử dụng thông minh của họ sẽ được tạo và trả về một hàm constructor chứ không phải là một đối tượng đơn giản, tức là một cái gì đó như:Các mẫu thiết kế AngularJS: Tôi có nên sử dụng các nhà máy để tạo các hàm tạo dựng không?

app.factory("Foo", function() { 
    function Foo(bar, baz) { 
    this.bar = bar; 
    this.baz = baz; 
    ... 
    } 

    Foo.prototype = { 
    constructor: Foo, 
    method1: function() { ... }, 
    method2: function() { ... }, 
    ..., 
    methodn: function() { ... }, 
    }; 

    return Foo; 
}); 

Sau đó, bạn có thể tiêm các hàm thành của bạn bộ điều khiển và gọi nó với new. Tôi thấy điều này về mặt thẩm mỹ và OOP-y, nhưng bây giờ tôi bắt đầu nghĩ rằng nó thực sự là một mô hình chống. Vấn đề là nó hoạt động tốt khi bạn đang làm việc trong các ngữ cảnh nhận thức AngularJS, nhưng một khi bạn muốn, ví dụ, gọi hàm khởi tạo từ giao diện điều khiển, sử dụng nó trong một Web Worker, hoặc sử dụng lại mã trong một non- Ứng dụng AngularJS, bạn bắt đầu phải làm việc xung quanh AngularJS hơn là với nó. Tôi bắt đầu tự hỏi, nếu cách tiếp cận này đã được misguided insofar như chức năng trong javascript đã có vẻ là "singletons" và dường như không cần bất kỳ sự giúp đỡ được instantiated.

Tôi có sử dụng sai các nhà máy AngularJS không? Tôi sẽ được phục vụ tốt hơn với các chức năng xây dựng tiếp xúc với phạm vi toàn cầu? Nói chung, có những yếu tố cụ thể thúc đẩy việc sử dụng các nhà máy/dịch vụ/nhà cung cấp AngularJS trên các đối tượng toàn cầu hay ngược lại không?

+1

Thay vì rút ngắn giá trị độ phân giải phụ thuộc được cung cấp bởi vùng chứa Dependency Injection, tôi khuyên bạn nên tìm kiếm tại trang trí mẫu hỗ trợ OOTB bởi $ supply.decorator (...) trong tài liệu góc. Việc đưa ra một mẫu thử nghiệm không phải là 'ác' nhưng khi bạn gọi 'mới' trên một thành phần có các phụ thuộc mà _you_ đang giải quyết, tôi không chắc chắn những gì bạn có được ngoại trừ, có lẽ, các nguyên mẫu có thể cấu hình dựa trên ngữ cảnh. Nếu đó là những gì bạn đang sau, sau đó bạn có thể sử dụng $ inject.get ('myWhatever') để biến nó thành Service Locator. – SonOfNun

+2

Nó không phải là một ý tưởng tốt. Ý tưởng của một nhà máy là cung cấp một giá trị mà không phải lo lắng về cách nó được xây dựng. [Câu trả lời này đưa ra một số giải thích tốt về cách sử dụng các nhà máy, dịch vụ và nhà cung cấp] (http://stackoverflow.com/questions/15666048/angular-js-service-vs-provide-vs-factory). – Bart

Trả lời

6

Có!

Nhà máy Cú pháp: module.factory ('factoryName', function); Kết quả: Khi khai báo factoryName như một đối số được tiêm, bạn sẽ là cung cấp giá trị được trả về bằng cách gọi tham chiếu hàm được chuyển đến module.factory. Cách sử dụng: Có thể hữu ích khi trả lại hàm 'lớp' mà sau đó có thể được tạo mới để tạo các phiên bản.

Nguồn: https://groups.google.com/forum/#!msg/angular/56sdORWEoqg/HuZsOsMvKv4J

Liên kết ở trên cũng được sử dụng như là nguồn để Bart's bình luận: AngularJS: Service vs provider vs factory

0

lẽ đây là một sử dụng thoải mái và thuận tiện trong bối cảnh góc và Javascript (mà xảy ra với cho phép các thao tác boggling tâm trí với các hàm tạo và các nguyên mẫu đối tượng), nhưng theo ý kiến ​​của tôi, nó có phần mâu thuẫn với logic mẫu của Nhà máy cổ điển.

Nhà máy có nghĩa là xây dựng các đối tượng mới bên trong nó, áp dụng một số cấu hình, khởi tạo và tiêm phụ thuộc vào đối tượng mới tạo, như được chỉ định trong cài đặt gốc (nếu bạn có). Ví dụ, bạn có thể yêu cầu nhà máy tạo kết nối lưu trữ và nhà máy tạo kết nối MySQL, kết nối SQLite hoặc kết nối Redis - trình điều khiển của bạn không thực sự quan tâm, miễn là đối tượng được xây dựng triển khai một số giao diện (hoặc sử dụng kiểu gõ vịt trong ngữ cảnh Javascript - nếu nó bỏ đi như một con vịt, đó là một con vịt).

Nhưng nếu bạn sử dụng new từ khóa sau khi bạn đã được gọi là Nhà máy làm việc bên ngoài của máy, sau đó nó là nếu bạn nói như sau:

"Này, nhà máy, cho tôi một nguyên mẫu (constructor) của một số mục và tôi sẽ tự mình tạo ra món đồ."

Vì vậy, trong trường hợp này máy của bạn không phải là một 'nhà máy cổ điển' để tạo các đối tượng mới nhưng một số nhà máy nguyên mẫu mà có một nguyên mẫu để cung cấp cho tất cả người gọi để họ có thể tự mình chế tạo các đối tượng mới.

Khi bạn có các hàm tạo đơn giản mà không có bất kỳ đối số nào, bạn có thể đồng ý với điều đó, nhưng trong ví dụ cổ điển (kết nối lưu trữ) việc sử dụng các nhà máy đó không có ý nghĩa bởi vì sau đó người gọi của nhà máy phải thực hiện công việc của nhà máy - tiêm các cấu hình và phụ thuộc vào đối tượng mới được tạo.