2012-02-09 33 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