thảo luận Vấn đề về separate Repository/Service/Controller

  • Người tạo chủ đề Người tạo chủ đề soledad86
  • Ngày bắt đầu Ngày bắt đầu
lệch kha khá đấy (bảng tầm 15 columns)
Xem tệp đính kèm 309409
DB gì mà chậm dữ, bên tôi mỗi select theo index chỉ 0.x -> 1.x ms là căng.
Tôi đoán cái execution time này không phải là db server mà tính cả round trip time.
Tất nhiên select * sẽ tệ nếu trong các cột có mấy field lớn (vì sẽ tốn IO khi trả về cho client), còn những trường hợp bình thường thì cứ vô tư đi
 
Chủ thớt nói đúng rồi, service thì chơi với repo, lấy ví dụ như 1 business nào đó phức tạp, trong 1 transaction cần sử dụng cả đống repo, mà quan trọng là cái business này được sử dụng đi sử dụng lại ở rất nhiều endpoint. Lúc này nếu controller mà giải quyết cái business này bằng cách chơi với cả đống repo đó, thử hỏi thằng controller khác muốn xài lại thì làm thế nào? chả nhẽ lấy instance của chả nội controller kìa để xài, có thấy phi lý không

nhưng mà đương nhiên nếu cái business đơn giản, chả cần xử lý gì nhiều thì từ controller cũng gọi vào repo được (vd như CRUD 1 cái entity đơn giản chẳng hạng)

cho nên tôi thấy tùy vào cái business thôi, chứ nói cái này đúng cái kia sai chung chung thì có mà cãi nhau tới chết
 
cá nhân mình thấy thế này có thể đi thẳng từ tầng controller qua tầng repo nếu chỉ có retrieve data ko thôi. Nhưng sau này cái controller đó có thêm insert update thì phải sửa để cho qua tầng service à. nên tốt nhất là build 3 tầng ngay từ đầu. cái mô hình củ hành có vẻ dể tiếp cận hơn đó nếu project bạn to và phức tạp.
 
Từ controller phi thẳng xuống repo thì nó gọi là fat controller nhá, lợi: đơn giản, hại: logic bị phình to ở phía controller, khó tái sử dụng đc chỗ khác, khi nghiệp vụ phức tạp dần thì mantainace cost phi như tên lửa. Nên hay ko nên thì mình k phán ngay đc, phải hiểu project của thớt đã. Mà thôi, k chống lại đc đám đông thì thôi, nhưng nhớ ghi chép lại sự kiện này, đến lúc nào mà có issue sảy ra từ mô hình này thì counter lại mấy thằng ngày xưa phản đối chú, oke? :sexy_girl:

via theNEXTvoz for iPhone
 
Hic, bạn thực sự có vấn đề trong việc tư duy logic.

Ngay từ đầu bạn chủ thớt đã cố gắng đưa vấn đề về việc đơn giản hoá, tránh việc 1 Service sẽ sinh ra nhiều repo. Giờ mới chỉ có 1 câu query join mà bạn sinh ra tới 3 repo class để handle. Thử tưởng tượng với business logic phức tạp thì vục mặt vào đống repo kia có mà chết à?
Em cũng từng gặp vấn đề như thím nói và chưa biết giải quyết bằng cách nào :(( em đang làm là 1 service sinh ra quá nhiều repository khiến hệ thống rất khó maintain hic

via theNEXTvoz for iPhone
 
chốt lại e thấy bác 4nh7i3m nói khá đúng cho các trường hợp normal, vậy xin mạn phép hỏi bác (và các bác khác nữa) mấy case mà các bác trên này có hỏi:
  • xử lý ntn với gọi các service với nhau - có nên gọi không?
  • với các lệnh Join thì đặt ở repository nào của table nào?
Trước tiên tui cảm ơn ông.

Nhưng tui chỉ nêu ý kiến thôi. Tui không bảo giờ nói cách của tui là đúng hay chính xác cả. Tui cũng chưa nói xấu ai bao giờ. Thích thì search post tôi mà xem nhưng thái độ nói chuyện của một số anh trong này phải nói là rất tệ. Chụp mũ, bẻ ý, đâm chọt cá nhân... nói chung là tệ (hay nói đúng hơn là hèn). Nên anh nào không thích tôi thì ignore tui mịa dùm cái. Còn ko nói để tôi ignore mấy anh.

Rồi về phần câu hỏi của bạn.

1. Circular Reference thì bạn hỏi thì tôi nói rõ hơn là mô hình tôi tổ chức có tới 5 lớp (chứ ko phải 3 lớp như thông thường).

Controller --> Service --> Session/Cache --> Repo --> Provider/IO.

Tạm bỏ qua cách gọi tên các lớp đi. Thì mô hình 5 lớp này tạm giải quyết được circular ref. Khi nào bị circular reference thì đưa function cần dùng (nhớ là function thôi nhé) xuống lớp nằm dưới.
Tức là ví dụ entity User sẽ có UserController, UserService, UserSession, UserRepo, UserProvider.
5 thằng sẽ phối hợp để đọc ghi dữ liệu và xử lý logic. Ví dụ, trong UserService nó có hàm KickUser cần dùng ở 1 service khác thì đưa nó xuống UserSession để dùng chung với Service khác.

Lưu ý: Nếu đưa hàm xuống 1 lớp mà lại lôi theo 1 đống khác xuống theo thì bạn coi lại design vì đó là dấu hiệu design của bạn bị lỗi.
Cái hay ở đây là lớp Session nó có thể chứa Business Logic mà vừa làm Cache luôn nên giảm tải cực lớn cho phần Repo bên dưới. Tương tự lớp Provider dành cho settings hay external content cố định.

2. Lệnh join thì thằng nào sở hữu Foreign key thì join ở thằng đó. Ví dụ UserTable có RoleId thì dùng join ở User để fetch Role. Câu này tôi ko chắc tôi có hiểu đúng ý bạn không?
 
Sửa lần cuối:
Nhân tiện topic có các bác nói về database, cho mình hỏi có thằng nosql nào hỗ trợ lưu record dưới dạng file như thằng sql h2databas không nhỉ?
 
Nhân tiện hỏi thêm vì trên này return ra full model nhưng khi trả về cho client thì chỉ trả về những field cần thiết, vậy bên client nên làm ntn cũng với bài toán trên? xây dựng thật nhiều model hay ntn?

Ví dụ: màn hình list user thì chỉ có 2 thông tin: username, email, màn hình user detail thì có full thông tin. Vậy sẽ cần xây dựng 2 model cho từng màn hình?
 
Nhân tiện hỏi thêm vì trên này return ra full model nhưng khi trả về cho client thì chỉ trả về những field cần thiết, vậy bên client nên làm ntn cũng với bài toán trên? xây dựng thật nhiều model hay ntn?

Ví dụ: màn hình list user thì chỉ có 2 thông tin: username, email, màn hình user detail thì có full thông tin. Vậy sẽ cần xây dựng 2 model cho từng màn hình?
Bạn nên dùng DTO - Data Transfer Object thay vì trả full model/entity.
Model/Entity chứa cả state và behavior, còn thông tin trả cho client chủ yếu là state nên trả thông qua DTO riêng cho dễ handle.
 
Bạn nên dùng DTO - Data Transfer Object thay vì trả full model/entity.
Model/Entity chứa cả state và behavior, còn thông tin trả cho client chủ yếu là state nên trả thông qua DTO riêng cho dễ handle.
vâng chắc em nói hơi khó hiểu, thì đúng là phía server chỉ trả về những thông tin cần thiết thôi, nhưng như vậy thì client lại phải xây dựng từng model cho từng màn hình phải ko?
 
vâng chắc em nói hơi khó hiểu, thì đúng là phía server chỉ trả về những thông tin cần thiết thôi, nhưng như vậy thì client lại phải xây dựng từng model cho từng màn hình phải ko?
Tưởng bác đang nói phía server, đá lên cho các bác làm client xử lý :byebye:
 
Bạn nên dùng DTO - Data Transfer Object thay vì trả full model/entity.
Model/Entity chứa cả state và behavior, còn thông tin trả cho client chủ yếu là state nên trả thông qua DTO riêng cho dễ handle.
DTO với entity như nhau thôi. bác cứ tập trung tiểu tiết mà k trả lời vào trọng tâm
 
các bác lạc đề quá, câu hỏi của em đơn giản thôi :beat_brick: Ví dụ: màn hình list user thì chỉ có 2 thông tin: username, email, màn hình user detail thì có full thông tin. Vậy sẽ cần xây dựng 2 model cho từng màn hình? :beauty: - phía client.
 
các bác lạc đề quá, câu hỏi của em đơn giản thôi :beat_brick: Ví dụ: màn hình list user thì chỉ có 2 thông tin: username, email, màn hình user detail thì có full thông tin. Vậy sẽ cần xây dựng 2 model cho từng màn hình? :beauty: - phía client.

Đúng. Giống view-model trong M-V-VM. Vm đó chưa có mà cần dùng thì tạo thêm. Tôi thấy ko vấn đề gì cả đâu.
 
các bác lạc đề quá, câu hỏi của em đơn giản thôi :beat_brick: Ví dụ: màn hình list user thì chỉ có 2 thông tin: username, email, màn hình user detail thì có full thông tin. Vậy sẽ cần xây dựng 2 model cho từng màn hình? :beauty: - phía client.
K cần thừa k sao cả. Bạn có chắc là màn list k thay đổi và sau này nó cần 9/10 field thì sao?
 

Thống kê chủ đề

Ngày tạo
soledad86,
Người trả lời cuối
freedom.9,
Trả lời
217
Lượt xem
33.245
Quay lại
Lên đầu trang