2013-05-21 4 views
2

У меня есть webapp с JSF, Spring и Mybatis. Эти структуры используются в контрольных, бизнес-и дао-слоях соответственно. В моем слое DAO у меня есть методы для операций CRUD. Теперь, в моем слое контроллера, мне нужно использовать операцию вставки. Для этого я мог бы использовать эту конфигурацию:Может ли слой контроллера вызвать прямо на слой Persistence?

Controller Layer

Я использую JSF с аннотациями

@ManagedBean 
public class Controller{ 
    @ManagedProperty("#{business}") 
    private Business business; 

    public void insert(){ 
     business.insert(); 
    } 
} 

Бизнес Layer

я использую Spring с аннотациями

public interface Business{ 
    public void insert(); 
} 

@Service("business") 
public class BusinessImpl implements Business{ 
    @Autowired 
    private DaoMapper mapper; 

    @Override 
    @Transactional 
    public void insert(){ 
     mapper.insert(); 
    } 
} 

DAO слой

Я использую Mybatis (mybatis-весна библиотека)

public interface DaoMapper{ 
    public void insert(); 
} 

Но как в этом случае мой бизнес слой только позвонить в DAO слой и не понимают любой другой операции, Я думаю, чтобы использовать эту конфигурацию:

Controller Layer

@ManagedBean 
public class Controller{ 
    @ManagedProperty("#{daoMapper}") 
    private DaoMapper mapper; 

    public void insert(){ 
     mapper.insert(); 
    } 
} 

DAO слой

public interface DaoMapper{ 

    @Transactional 
    public void insert(); 
} 

Я уже протестирована и работает нормально, но я хотел бы знать, если я подвергаясь плохая практика

[EDIT]

На самом деле DaoMapper interface - это Mapper класса MyBatis, который связан с XML-файлом (Look). Я не знаю, делает ли это класс DAO. Я думаю, что я должен на самом деле назвать это Persisence Layer или Mapper Layer

enter image description here

Источник: http://www.infoq.com/articles/ddd-in-practice

Как вы можете видеть. Презентационный слой. В моем случае Контрольный уровень (я думаю, что я сделал еще одно именование ошибки), вызывается непосредственно в DTO (или это то, что я понимаю).

Если на моем контроллере или уровне презентации (как бы вы это ни называли) мне нужна вставка или операцию обновления, я мог бы ссылаться непосредственно из класса сопоставления, или мне обязательно нужно создать бизнес-класс только для этого класса, чтобы вызвать класс сопоставления

Теперь. Если возможно использовать эту конфигурацию, у меня есть сомнения:

Предположим, что в методе моего бизнес-класса мне нужно вызвать операцию вставки.Это было бы как:

@Service("business") 
public class BusinessImpl implements Business{ 
    @Autowired 
    private DaoMapper mapper; 

    @Override 
    @Transactional 
    public void insert(){ 
     mapper.insert(); 
    } 
} 

Но метод вставки из интерфейса DaoMapper уже @Transactional аннотацию. Метод Вставка будет дважды затронута @Transactional аннотация. Разве это не проблема?

+1

Если вам не нужны услуги - не используйте их вообще. Но если вы решите использовать их и сможете дифференцировать программу позже, хотя на данный момент у них будут только вызовы DAO, придерживайтесь всегда их использования, а не DAO. Мой совет: не смешивайте и не следуйте выбранному соглашению! – skuntsel

+0

Другими словами, если в другом классе контроллера вызовет бизнес-уровень, связываясь с базой данных. Я всегда буду иметь дело с бизнес-слоем, хотя мой бизнес-уровень ** только ** называет упорство (мы согласились, что было бы лучше назвать его), и не выполнял другую работу. Как глупый слой. Не влияет ли это на приложение? –

+0

Это все? Можете ли вы дать мне больше возможностей? –

ответ

2

Я предлагаю не использовать DAO в контроллере напрямую. По моему мнению. Дао-слой - это отображение из базы данных, например, если вы хотите изменить другую базу данных (например, от sql до nosql), единственное, что только создает новый DAO и вводится, но оставить контроллер & Сервисные функции вообще не изменены. Так же и диспетчер, его основная ответственность - обрабатывать запрос и ответ, работа должна выполняться на уровне бизнеса/сервиса. Если это неправильно, оцените пункт

+0

Вы что-то не так. Мой класс контроллера не обрабатывает запрос и ответ. Это обрабатывается классом FacesServlet. Помните, что я использую JS. Что касается другого. Хорошо ли носить слои глупыми ?. Скорее, слои, которые вызывают только другой слой, не выполняют другую операцию в вашем слое. –

1

Если вы хотите удалить слои, у вас может быть контроллер и служба, но пропустите DAO. Ваш сервис может вызвать отображение непосредственно, так как у вас нет какого-либо конкретного кода запроса. Я знаю, что некоторые известные Java-люди, такие как Адам Бьен, считают DAO мертвым образцом. http://www.adam-bien.com/roller/abien/entry/jpa_ejb3_killed_the_dao

+0

Закончил редактирование моего вопроса. Как я уже сказал, я должен использовать название ** Persistence layer ** вместо ** DAO Layer **. В интерфейсе MyBatis mapper связан с XML-файлом ([Look] (http://mybatis.github.io/mybatis-3/es/sqlmap-xml.html)) –