2011-02-02 34 views
14

Tôi đã tự hỏi nếu có thể tạo ra một giao diện dịch vụ trên Grails và tôi không thể tìm thấy một cách thích hợp để làm điều đó. lời giải thích này là không thỏa đáng, vì nó dường như để trộn Java và Groovy:Làm cách nào để tách giao diện khỏi việc triển khai trong các dịch vụ Grails?

http://www.grails.org/doc/latest/guide/8.%20The%20Service%20Layer.html

Dường như với tôi giống như một lỗ hổng thiết kế xấu của khuôn khổ này, cho rằng cơ chế giao diện là một trong những tính năng tốt nhất của Java (và hầu hết các ngôn ngữ OO).

Bất kỳ ý tưởng nào để làm rõ vấn đề này?

Cảm ơn! Mulone

+3

Sự cố khi tạo giao diện trong 'src' và triển khai giao diện trong dịch vụ là gì? Hay bạn muốn có thể thay thế việc triển khai dịch vụ một cách nhanh chóng? Các đại biểu (http://groovy.codehaus.org/Replace+Inheritance+with+Delegation) sẽ giúp bạn. –

Trả lời

5
  • Xác định giao diện dịch vụ trong một lớp học com.mycompany.mypackage.MyInterface.groovy lưu trữ under src/groovy
  • Xác định việc thực hiện dịch vụ lưu trữ dưới grails-app/services

    class MyService implements MyInterface { 
        // service implementation goes here 
    } 
    
+0

nhưng trong trường hợp này tôi có thể chỉ định trong bộ điều khiển "def myInterface"? Làm thế nào tiêm sẽ làm việc? – Mulone

+0

Không, bạn sẽ khai báo 'def myService' –

+0

Cách tiêm phụ thuộc sẽ biết bạn đang thực thi tiêm vào bộ điều khiển nào? Như tim_yates nói, bạn phải nói với nó, bằng cách đặt tên nó. Trong suốt thời gian chạy, bạn có thể lấy một tham chiếu bean khác thực hiện giao diện của bạn và gán nó cho myService, và do đó có cùng các phương thức có sẵn. – sbglasius

1

của nó không phải là một lỗ hổng thiết kế. Groovy khác với java ở chỗ nó là một ngôn ngữ động sử dụng 'duck-typing'. Whats thú vị trong groovy là cũng có giao diện. Vì vậy, nếu bạn làm theo gợi ý của @ don, bạn có thể đảm bảo rằng dịch vụ của bạn phù hợp với giao diện, nhưng cách bạn làm DI với grails là chỉ cần chỉ định việc triển khai dịch vụ. tức là bạn không nhận được kiểm tra thời gian biên dịch trong đó bạn sử dụng triển khai dịch vụ, giống như bạn thực hiện trong java.

Lưu ý rằng không có khớp nối chặt chẽ ở đây. Khớp nối ngụ ý rằng một cái gì đó là ràng buộc với một loại. Nhưng với hệ thống gõ lỏng lẻo của groovy, các loại cơ bản là những sinh vật năng động. Vì vậy, trong java, nếu bạn khai báo một kiểu để thực hiện cụ thể, mã có thể không biên dịch nếu bạn thay đổi kiểu sau này. Trong groovy, mã sẽ luôn luôn biên dịch nếu bạn sử dụng 'def' ... (Tôi nghĩ rằng điều này là chính xác)

17

Bạn có thể có một giao diện, nhưng thực sự bạn không cần. Nếu tôi hiểu chính xác bạn, bạn muốn có hai triển khai dịch vụ và có thể chọn một dịch vụ nào để sử dụng.

Đơn giản chỉ cần thực hiện hai dịch vụ đặt tên ví dụ MyService1MyService2, sau đó trong grails-app/conf/spring/resource.groovy bạn có thể chỉ định:

beans = { 
    ... 
    // syntax is beanId(implementingClassName) { properties } 
    myService(MyService1) 
    ... 
} 

hoặc thậm chí:

beans = { 
    ... 
    if (someConfigurationOption) { 
     myService(MyService1) 
    } else { 
     myService(MyService2) 
    } 
} 

Đây là cách bạn nói với mùa xuân mà dịch vụ để thực sự tiêm cho myService. Bây giờ bạn sẽ có thể sử dụng myService như:

public MyController { 
    def myService 
    ... 
} 

và Spring sẽ tự động triển khai đúng cách. Điều này cho phép bạn định cấu hình triển khai dịch vụ để sử dụng dựa trên ví dụ trên một số cấu hình.

0

Giải pháp tốt nhất tôi tìm được cho điều này là sử dụng Bí danh bean mùa xuân.Về cơ bản bạn cần phải:

1) Tạo một giao diện trong src/groovy (MyService.groovy)

2) Tiêm dịch vụ của bạn bất cứ nơi nào bạn cần nó:

class MyController { 
    MyService myService 
} 

3) Tạo các dịch vụ thường xuyên của bạn thực hiện điều đó giao diện (ImplOneService.groovy, ImplTwoService.groovy)

4) Thêm mục nhập vào resources.groovy nơi bạn xác định cài đặt nào cần sử dụng (cuối cùng, thử nghiệm môi trường hoặc bất kỳ thứ gì bạn cần):

beans = { 
    if (...development, useFTP, etc...) { 
     springConfig.addAlias 'myService', 'ImplOneService' 
    } else { 
     springConfig.addAlias 'myService', 'ImplTwoService' 
    } 
} 

Complete sources here

Bình luận của tôi: Sử dụng giao diện trong groovy thực sự có vẻ như một số loại "Tôi muốn gắn bó với một số công cụ java Tôi cảm thấy thoải mái hơn với". Trong trường hợp này, gõ mạnh. Nhưng đó chính xác là phần hay của câu nói "Đừng lo, bạn có thể giữ cách java nếu bạn muốn".

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