2012-06-29 61 views
1

下面的代碼無法正常工作(當然),這是因爲標線不編譯:春+蒙戈+泛型+靈活性

MyClass { 
    //singleton stuff 
    private static MyClass instance; 
    private MyClass() {} 
    public static MyClass getInstance() { 
     if(instance==null) { 
      instance = new MyClass(); 
     } 
     return instance; 
    } 

    // method creating problems 
    public NonGenericSuperClassOfGenericClass create(Class<?>... classes) { 
     if(someCondition) 
      return new GenericClass<classes[0],classes[1]>; // DOES NOT COMPILE 
     else 
      return new OtherGenericClass<classes[0]>; 
    } 
} 

因此,我居然不知道是不是「創造」會返回

GenericClass<classes[0],classes[1]> 

OtherGenericClass<classes[0]> 

具有不同的參數數目。

這是因爲我使用春天,我打算使用MongoDB的,但在未來我可能需要切換到不同的東西(例如休眠)。

類GenericClass是一樣的東西:

GenericClass<PersistetType1, Long> 

GenericClass<PersistentType2, Long> 

其中PersistentType1/2,我需要最後在DB存儲類,而,GenericClass是一種代理的訪問Mongo API。實際上,它看起來像:

public MongoTemplate getTemplate(); 
    public void save(T toInsert); 
    public List<T> select(Query selectionQuery); 
    public T selectById(ID id); 
    public WriteResult update(Query selectionQuery, Update updatedAttributes); 
    public void delete(T toRemove); 
    public void delete(Query selectionQuery); 

現在,什麼? 從控制器(或實體,如果你挑剔)我需要實例化存儲庫並調用任何方法。這導致控制器與MongoDB耦合,即它們明確地必須實例化這樣的GenericClass,它實際上被稱爲MongoRepository並嚴格依賴於Mongo(實際上它是具有恰好兩個「自由度」的泛型)。

所以,我決定創建MyClass,這是一個隔離控制器的進一步代理。通過這種方式,Controller可以獲取MyClass的單​​個實例,並讓它創建相應存儲庫的新實例。特別是,當「somecondition」成立時,這意味着我們想要使用MongoRepository(當它是假的,也許需要實例化一個Hibernate代理,即HibernateRepository)。然而,MongoRepository是通用的,因此它需要某種形式的實例化,我希望作爲參數傳遞。

不幸的是,泛型在編譯時被解析,因此它們不適合我,我想。

我該如何解決這個問題?

回答

2

爲了從應用程序邏輯中分離底層持久性存儲,我將使用DAO方法。

用所需的方法定義DAO的接口。保存,更新等。然後爲您可能需要的每個持久性提供者提供一個實現,例如UserAccess可能是您可以實現爲HibernateUserAccess和MongoUserAccess的接口。在每個實施中,您都會注入適當的模板。 Mongo或Hibernate並使用它來完成持久性操作。

您可能遇到的問題是您的加載操作將返回一個用戶實例,這需要在持久性提供程序上有所不同,即JPA註釋將與MongoDB(泄漏抽象)所需的Spring Data註釋不同。

我可能會通過創建一個用戶界面來表示持久性操作的結果併爲每個持久性提供者實現一個實現來解決這個問題。或者返回您從JPA或Mongo加載的結果中生成的通用模型。

+0

當然,這是一個解決方案,但它需要我爲每個持久實體實現一個DAO。我不想這麼做,因爲它需要付出很多努力,而提供持久性的可能性相當低。我寧願讓我的20/25實體與MongoDB結合在一起,並在不改變提供商的情況下賭博。 – Manu

+0

我會那麼做。更改持久性提供程序不是經常發生的事情。無論如何,涉及更新25個實體的努力並不是那麼好。 –