2014-07-09 33 views
10

Guice ile genel tür enjekte etmeye çalışıyorum. İmleç sınıfında bulunan Deposu < T> var. Ben İmleç < User> oluştururkenGuice enjekte etme Genel tür

public class Cursor<T> { 

    @Inject 
    protected Repository<T> repository; 

Yani, ayrıca> Guice < Kullanıcı Deposu benim depo enjekte etmek istiyorum. Bunu yapmanın bir yolu var mı?

+0

UserRepository sınıfınız var mı? – gontard

+0

Bir tane var, ancak genel olarak nasıl enjekte edeceğimi bilmiyorum, çünkü daha fazla depo var. – Gelidus

cevap

15

Sen kullanmak zorunda bir TypeLiteral: Bir Injector gereklidir

import com.google.inject.AbstractModule; 
import com.google.inject.TypeLiteral; 

public class MyModule extends AbstractModule { 

    @Override 
    protected void configure() { 
    bind(new TypeLiteral<Repository<User>>() {}).to(UserRepository.class); 
    } 
} 

Cursor<T> bir örneğini almak için:

import com.google.inject.Guice; 
import com.google.inject.Injector; 
import com.google.inject.Key; 
import com.google.inject.TypeLiteral; 

public class Main { 

    public static void main(String[] args) { 
    Injector injector = Guice.createInjector(new MyModule()); 
    Cursor<User> instance = 
     injector.getInstance(Key.get(new TypeLiteral<Cursor<User>>() {})); 
    System.err.println(instance.repository); 
    } 
} 

Diğer ayrıntılar in the FAQ.

+0

Aynı şeyi düşündüm ama bunu denedin mi? Repository anahtar olarak kullanılamıyorum; Tamamen belirtilmemiş. – steffen

+0

Bu tür bir yapılandırmayı sık sık sorunsuz kullanırım. Ve ben – gontard

+0

guice belgelerine bazı bağlantılar sağladım. Bu, enjekte edilecek UserRepository için yapıcıya ihtiyacım var. Yani Guice.createInjector'ı aramanın hiçbir yolu yoktur. 1. – Gelidus