È possibile aggiungere il livello di servizio nel pattern MVC?

0

Sto lavorando su un progetto javaFX usando il Hibernate e il database H2 , sto cercando di seguire il concetto di pattern di progettazione MVC, quindi ho creato 3 pacchetti:

  1. modelli : contiene classi POJO

    2.1 views.fxml : contiene file fxml

    2.2. views.controllers : contiene le classi di controller dei file fxml

3 . dao : contiene classi che interagiscono con il database.

Al momento ogni cosa va bene, ma quando ho seguito un tutoriel, ho scoperto che ha aggiunto Livello servizio , questo ha un ruolo per creare oggetti e inviarli al livello DAO , ho creato questo esempio, ma sono confuso se è vero o sono fuori i concetti, questo è il mio esempio:

Modello:

@Entity
@javax.persistence.Table(name = "ENTREPRENEUR")
public class Entrepreneur implements Serializable {

    private String Id;
    private final StringProperty lastName = new SimpleStringProperty();
    private final StringProperty firstName = new SimpleStringProperty();
    private final StringProperty email = new SimpleStringProperty();
    private final StringProperty password = new SimpleStringProperty();
    private final StringProperty category = new SimpleStringProperty();
    public Date signDate;
    public byte[] picture;

    public Set<Corporation> corporations;

    public Entrepreneur() {
        corporations = new HashSet<>();
    }

    @OneToMany(mappedBy = "entrepreneur")
    public Set<Corporation> getCorporations() {
        return corporations;
    }

    public void setCorporations(Set<Corporation> corporations) {
        this.corporations = corporations;
    }

    @Column(name = "CATEGORY")
    private String getCategory() {
        return category.get();
    }

    public void setCategory(String value) {
        category.set(value);
    }

    private StringProperty categoryProperty() {
        return category;
    }

    @Column(name = "PICTURE")
    public byte[] getPicture() {
        return picture;
    }

    public void setPicture(byte[] picture) {
        this.picture = picture;
    }

    @Column(name = "SIGN_UP_DATE")
    public Date getSignDate() {
        return signDate;
    }

    public final void setSignDate(Date signDate) {
        this.signDate = signDate;
    }

    @Id
    @GeneratedValue(generator = "system-uuid")
    @GenericGenerator(name = "system-uuid", strategy = "uuid")
    @Column(name = "ID", updatable = false, nullable = false)
    public String getId() {
        return Id;
    }

    public void setId(String Id) {
        this.Id = Id;
    }

    @Column(name = "EMAIL")
    public String getEmail() {
        return email.get();
    }

    public final void setEmail(String value) {
        email.set(value);
    }

    public StringProperty emailProperty() {
        return email;
    }

    @Column(name = "PASSWORD")
    public String getPassword() {
        return password.get();
    }

    public final void setPassword(String value) {
        password.set(value);
    }

    public StringProperty passwordProperty() {
        return password;
    }

    @Column(name = "FIRST_NAME")
    public String getFirstName() {
        return firstName.get();
    }

    public final void setFirstName(String value) {

        firstName.set(value);
    }

    public StringProperty firstNameProperty() {
        return firstName;
    }

    @Column(name = "LAST_NAME")
    public String getLastName() {
        return lastName.get();
    }

    public final void setLastName(String value) {
        lastName.set(value);
    }

    public StringProperty lastNameProperty() {
        return lastName;
    }

    public void addCompany(Corporation company) {
        if (!corporations.contains(company)) {
            corporations.add(company);
        }
    }

Controller:

  @FXML
    private void createAccount() throws IOException {
        String lastNameValue = lastNameField.getText();
        String firstNameValue = firstNameField.getText();
        String categoryValue = this.category.getValue();
        String emailValue = emailField.getText();
        String passwordValue = Security.encrypt(passwordField.getText());
        new EntrepreneurServiceImp().create(lastNameValue, firstNameValue, categoryValue, emailValue, passwordValue);
    }

Servizio:

public class EntrepreneurServiceImp implements EntrepreneurService {

    @Override
    public void create(String lastName, String firstName, String category, String email, String password) {

        //Create and fill an object
        Entrepreneur entrepreneur = new Entrepreneur();
        entrepreneur.setLastName(lastName);
        entrepreneur.setFirstName(firstName);
        entrepreneur.setCategory(category);
        entrepreneur.setEmail(email);
        entrepreneur.setPassword(password);
        entrepreneur.setSignDate(Date.valueOf(LocalDate.now()));

        //Send object to DAO layer
        new EntrepreneurDao().save(entrepreneur);

    }

}

DAO:

public class EntrepreneurDao extends DAO<Entrepreneur> {

    @Override
    public boolean save(Entrepreneur entrepreneur) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        session.save(entrepreneur);
        session.getTransaction().commit();
        return true;
    }
}

Privatamente, creo e riempio l'oggetto in layer controller e chiamo il metodo DAO dal controller , ma ora ho aggiunto Livello di servizio che ha un ruolo solo con gli oggetti, La mia implementazione è vera o no?

    
posta Xlint Xms 19.03.2018 - 20:39
fonte

1 risposta

2

La tua implementazione è giusta, ma c'è qualcosa che potresti migliorare.

Se vuoi introdurre S (= livello di servizio) in MVC, allora questo è un modo (normale) per farlo:

Prima: M < - > C < - > V

Dopo: M < - > S < - > C < - > V

Il controller usa la classe di servizio per fare business logic. Tutta la logica aziendale è gestita dalla classe di servizio ed è quindi in un luogo centralizzato.

La cosa che ti manca è una fabbrica di servizi. Vorrei introdurre una fabbrica di servizi che è responsabile per intonare specifiche realizzazioni del servizio. Nelle classi C (controller), è necessario creare un'istanza degli oggetti di servizio utilizzando la factory di servizio. L'oggetto Servizio quindi stesso istanzia tutti i DAO. Quindi delegare tutte le operazioni CRUD alla classe di servizio e lasciarla gestire.

Il vantaggio di questo è che puoi scambiare il service factory che passi alle classi controller in un posto centralizzato per cambiare completamente il comportamento.

    
risposta data 20.03.2018 - 00:40
fonte

Leggi altre domande sui tag