Servizio con iniziazione modello astratta

1

Voglio implementare un modulo astratto per memorizzare crediti e ho la seguente struttura:

Modello: credito (estratto)
Dao: creditDao (interfaccia)
Servizio: CreditService

Il modello di credito dovrebbe essere implementato nell'applicazione che utilizza il modulo. L'applicazione può scegliere come salvare il modello in qualsiasi database.

Ma il problema è che devo avviare le istanze, ma non posso perché è astratto.

Bene, le mie soluzioni sono:

  1. Crea un metodo astratto nel servizio (ad esempio createModel) ma voglio evitare un servizio astratto.
  2. Creare un metodo astratto nel dao per creare il modello. (Preferisco in questo modo)
  3. Una propria classe per avviare il modello CreditFactory (L'applicazione deve implementare questo)

Ma la mia domanda è, esiste un altro modo migliore. Forse uno schema che non conosco?

Sono nuovo nel mondo di Java, forse la parola chiave è generica. Probabilmente dovrò usare i farmaci generici.

Mi piacerebbe sentire le tue soluzioni.

    
posta Mallorca Software 29.09.2017 - 20:33
fonte

1 risposta

0

I miei suggerimenti:

  • Rimuovi l'estratto dal tuo modello di credito. Perché : la tua applicazione principale (app di credito) deve funzionare indipendentemente da qualsiasi client e qualsiasi database. Dovresti essere in grado di testare l'unità senza UI o DB. Pertanto, il database dovrebbe idealmente essere un plug-in per la tua app principale (registrata da una specifica applicazione delle tue regole aziendali principali). In questo modo, l'applicazione principale deve definire che cos'è un modello di credito, indipendentemente dal database
  • Il tuo servizio dovrebbe ricevere istanze di credito dal cliente. Secondo il tuo esempio, il cliente dovrebbe essere perfettamente in grado di chiamare il metodo di servizio che gli trasmette un credito.
  • Implementa il livello di accesso ai dati più necessario. Poiché hai già definito un'interfaccia Dao, è facile rendere il DB un plug-in per la tua app. Ora, creane alcuni ad es. HibernateDataAccess layer per i tuoi dati e implementa tutte le specifiche per la persistenza in questa libreria (di nuovo: queste specifiche non dovrebbero essere all'interno del modello di credito - ecco perché mi hai detto che era astratto)
  • Crea un'applicazione e, nel punto di accesso di questa applicazione, "registri" al servizio l'oggetto ICreditDao (tramite l'iniezione di dipendenza) che sarà responsabile della persistenza dei modelli di credito della tua app.

Si noti che questi suggerimenti non sono strettamente correlati a Java. Per maggiori informazioni, dai un'occhiata a "Clean Architecture" di Bob Martin ( link )

EDIT: qui proverò a fornire alcuni esempi di codice per illustrare i miei punti e rispondere a tutte le tue domande.

Progetto CreditCoreLibrary

//Defines a model for Credit, to be used by a client application
public class Credit {
   //...attributes
   public CreditAttachable getCreditAttachable() {
        ///...
   }
   public double getAmount() {
        ///...
   }
}

//Needs to be implemented by another library, to be used by
//the client application
public interface CreditDao {
    void SaveOrCreate(Credit credit);
    IList<Credit> getAll();
}

public class CreditService {

    private CreditDao creditDao;

    public CreditService(CreditDao creditDao) {
        //The service relies on the concrete implementation of
        //the Dao, provided by the client app
        this.creditDao = creditDao;
    }

    //Methods receive and return Credit models defined in this core library
    public void AddCredit(Credit credit) {
        creditDao.SaveOrCreate(credit);
    }

    public IList<Credit> GetCreditList() {
        return creditDao.GetAll();
    }
}

CreditHibernateDataAccessLibrary project

Ecco un file di mapping xml che associa una colonna in DB a una proprietà nella classe:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
 "-//Hibernate/Hibernate Mapping DTD//EN"
 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping>
   <class name="Employee" table="EMPLOYEE">
      <meta attribute="class-description">
         This class contains the employee detail. 
      </meta>
      <id name="id" type="int" column="id">
         <generator class="native"/>
      </id>
      <property name="firstName" column="first_name" type="string"/>
      <property name="lastName" column="last_name" type="string"/>
      <property name="salary" column="salary" type="int"/>
   </class>
</hibernate-mapping>

Ecco un'implementazione Tao specifica, che utilizza l'API di Hibernate:

public class HBCreditDao implements CreditDao {
    //...uses Hibernate API to perform CRUD on your DB
    //...which will use the mapping xml file to be able
    //to create Credit objects based on DB data
}

Progetto MyApplication (potrebbe essere un'app Web o anche un'app console)

//This is just an example, but it means that in your application
//entry point, you need to "register" the Daos used by your app
//in the Service
int main() {

    //This project uses CreditHibernateDataAccessLibrary.jar
    HBCreditDao myDao = new HBCreditDao();

    //This project uses CreditCoreLibrary.jar
    //This injects a specific Dao object into the service
    CreditService service = new CreditService(myDao);

    //Perform operations using the service
    IList<Credit> creditList = service.GetCreditList();
}

PLUS: visualizza ulteriori informazioni sui file di mapping di Hibernate ( link )

    
risposta data 29.09.2017 - 22:03
fonte

Leggi altre domande sui tag