2012-03-13 8 views
4

Grailsの 'User'ドメインクラスに 'GraauditService'を注入しようとしています。
私は輸入com.gra.audit.GraauditServiceドメインクラスでgrailsサービスを注入する問題

class User { 
def graauditService // or even GraauditService graauditService with graauditService as transient 
....... 

以上が動作しないコントローラ
にそうであるように、私は直接注入する方法を試してみましたが、Grailsの1.3.7 を使用しています。 graauditServiceは常にnull

として来ている私はまたhere

を示すようApplicationHolderを通じて注入しようとしたが、ApplicationHolderが、今

私は、ドメインクラスのサービスを利用することができますどのように推奨されませんように見えますか?

+0

これは、従来のウェブアーキテクチャは、ドメインがカーネルである[マイクロカーネルパターン](http://en.wikipedia.org/wiki/Microkernel)に似ています。長い話は短いです:ドメインクラスは "ビジネスドメイン"ロジックを扱い、時にはドメイン指向サービスはドメインを含む共通のアクションを提供するファサードとして機能します。だから、Grailsはドメインクラスにサービスを注入しません。そこから呼び出すことはできません。 何をしようとしていても、おそらくサービス層でやり遂げるのに適しています。達成する必要があるものを拡大してください。 – Esteban

+0

save、delete、loadなどの、このドメインクラスのさまざまなイベントにauditlogエントリを追加しようとしています。 –

+1

@Esteban GrailsがGrails domanクラスにサービスを注入しないというのは真実ではありません。私のアプリケーションでは 'springSecurityService'を自分のドメインクラスに挿入することができましたので、保存する前にユーザーのパスワードをエンコードすることができます。私はドメインクラスにサービスを注入することは常に悪い練習であるというあなたの主張に同意しない –

答えて

0

hereを示すように、解決策は、ApplicationHolderを通してそれを注入することですBurt Beckwithさん。

上記の解決策は、Grails 2.0では動作しますが、1.3.7以前では動作しません。

0

は一時キーワードを使用して、それを注入してみてください。

class User { 
    transient graauditService 
} 
+0

それはまだnullとして出てくる、私はApplicationHolderメソッドを使用してnullではないが、サービスでメソッドを呼び出さない? –

+0

このサービスはコントローラに挿入できますか?このサービスの実際のクラス名は何ですか? – Gregg

+0

スラッシュ名はGraauditServiceで、コントローラGraauditService graauditServiceの次の宣言はうまくいきます。 –

3

次作品私のためにGrails 1.3.7については

class User { 

    def springSecurityService 
    static transients = ['springSecurityService'] 
} 
+0

ああ、私はGrails 2.0を見ていました。 1.3.7から変更したことを忘れてしまった。 – Gregg

+0

ApplicationHolderからサービスを受けると、私のために働きます。それは今のところ良いことだ。 –

関連する問題