2012-02-09 46 views
4

似乎無法找到關於此的信息,如果您有一些信息,請將我指向正確的主題/帖子/鏈接!在grails中更改注入服務的名稱

我有一個服務,可以說它叫'SomeServiceWithAReallyLongNameICannotChange'。當然,要使用服務的正常途徑是允許使用的Grails無論typless或鍵入的符號注入他們:

class SomeClass{ 
    //... 
    def someServiceWithAReallyLongNameICannotChange 
    //... 
} 

- 或 -

class SomeClass{ 
    //... 
    SomeServiceWithAReallyLongNameICannotChange someServiceWithAReallyLongNameICannotChange 
    //... 
} 

我想什麼做的是重新命名服務到更短的東西,但只在我使用它的地方,因爲我不能更改實際服務的名稱。我嘗試使用'as'符號,就像使用import一樣,我嘗試在類型聲明中更改名稱,但這些東西似乎都不起作用。這可能嗎?

我想是這樣的:

class SomeClass{ 
    //... 
    def someServiceWithAReallyLongNameICannotChange as SS 
    //and I tried 
    def SomeServiceWithAReallyLongNameICannotChange SS 
    //no joy 
    //... 
} 

感謝您的幫助!

回答

6

的解決方案是按類型自動裝配。默認情況下,grails使用autowire的名稱,因此您必須使用與bean相同的名稱聲明該服務。

這裏的例子

class FooController { 

    boolean byName = false //set autowire by type 
    SomeReallyLongService service 

} 
  1. 你必須定義一個布爾變量綽號,並將其設置爲false
  2. 不能DEF使用,但在聲明服務
  3. 時必須使用的實際類型的服務
  4. 它將爲整個控制器啓用按類型的自動佈線,因此所有其他依賴項也將按類型自動佈線

這是解釋here

更新: 它甚至可以使用Autowired註釋與限定符。

例子:

class MyController { 

    @Autowired 
    @Qualifier("myServiceWithDifferntName") 
    def someService 

} 
+0

謝謝!我很驚訝,我沒有在搜索時遇到這種情況。我認爲這是我將使用的方法,儘管我不能同時做這兩件事(例如,按名稱命名a,b和c,並且手動按d鍵入類型)。 – Quad64Bit 2012-02-16 01:55:54

3

你應該通過resources.groovy

beans = { 
    ss(SomeServiceWithAReallyLongNameICannotChange) 
} 

能夠創建一個新的bean,然後可以正常注入它:

class SomeClass { 
    //... 
    def ss 
    //... 
} 
+0

按照類型自動裝配而不是創建重複的豆不是更好? – 2012-02-10 04:15:14

+0

啊,好吧,這也是一個很好的解決方案。我想我最終會通過類型方法使用汽車線,但這種看似明顯的技術(後見之明是20/20)是一個很好的工具。我想我還有另外一種情況,這種情況非常好!謝謝! – Quad64Bit 2012-02-16 01:57:22

1

另一種選擇,如果你不想被類型在整個控制器使用自動裝配,你也不希望因爲某些原因添加自定義的bean,就是增加一個簡單的方法來你的控制器,你需要的服務,像這樣:

def someServiceWithAReallyLongNameICannotChange 
def getSS() { someServiceWithAReallyLongNameICannotChange } 

然後,你可以參考使用ss.someMethod()該控制器內的任何地方的服務。

但是,這仍然要求您爲使用此服務的每個控制器添加一大塊代碼,否則您的服務命名將不一致。

(就個人而言,我認爲doelleri的方法是最好的,因爲它可以讓你在不修改各個類別的命名保持一致。)

+0

當然可以!爲什麼我沒有想到這一點。我一直在用java這樣的技術,因爲某些原因,它只是沒有計算。謝謝! – Quad64Bit 2012-02-16 01:58:18

0

我嘗試過了,它不是爲我工作中,Grails 3,做了這樣做

import org.springframework.beans.factory.annotation.Autowired 
... 
@Autowired 
PaymentStrategyService paymentStrategySvc