Pertanyaan ini tentang penerapan aturan aplikasi saya yang membingungkan saya.
Pengontrol saya menggunakan layanan dan layanan menggunakan repositori.
public class CommentController: ApiController{
[HttpPost]
public bool EditComment(Comment comment){
commentService.Update(comment);
}
}
public class CommentService{
ICommentRepository repository;
....
....
public void Update(Comment comment){
repository.Update(comment);
}
}
Jika pengguna diautentikasi, ia dapat memperbarui komentar.
Tetapi pengguna harus mengedit komentar sendiri.
Tetapi seorang admin dapat mengedit semua komentar.
Tetapi komentar tidak dapat diedit setelah tanggal yang ditentukan.
Edit oleh departemen
Dan saya punya sesuatu seperti aturan ini.
Jika saya menerapkan aturan "komentar pengguna mengedit sendiri" di lapisan layanan, saya akan mengubah methot pembaruan dan melewati parameter pengontrol pengguna. Identitas. Nama,
public class CommentService{
ICommentRepository repository;
....
....
public void Update(string updatedByThisUser, Comment comment){
// if updatedByThisUser is owner of comment
repository.Update(comment);
}
}
Tapi, apakah benar mengubah operasi layanan dengan aturan?
Saya sedikit bingung tentang di mana saya bisa menerapkan aturan. Di controller atau dalam layanan atau di repositori.
Apakah ada cara standar untuk melakukan ini seperti pola desain.
sumber
[Authorize(Roles="member, admin")]
dan sekarang semua metode tindakan di Controller hanya dapat diakses oleh pengguna dalam peran "anggota" atau "admin".Jawaban:
saya akan
isUserAllowedTo(user, PermissionService.Permissiontype.Update, PermissionService.Topic.COMMENT, additionalContextRelevantParameters)
PermissionService
metode dalam pengontrol, di mana info konteks yang diperlukan (yaitu dari sesi) tersedia.Anda dapat mendesain arsitektur Anda untuk memanggil layanan izin di CommentService. Tetapi saya tidak akan merekomendasikan ini karena ini akan menambah dependensi tambahan ke dalam layanan (yaitu sesi) yang membuat unit-pengujian layanan jauh lebih sulit
sumber
Pertama, luangkan waktu untuk mempertimbangkan apa yang sebenarnya bertanggung jawab atas layanan komentar. Ini akan tergantung pada persyaratan spesifik Anda, dan mungkin bahkan penilaian terbaik Anda sendiri.
Jika tanggung jawab layanan komentar terbatas pada memperbarui komentar yang diberikan , maka apa yang Anda tulis baik-baik saja. Dalam hal ini, Anda perlu mempertimbangkan beberapa logika kondisional lainnya untuk memeriksa apakah komentar yang diberikan dapat diperbarui. Anda mungkin akan melakukan ini di controller, atau Anda dapat membuat sub sistem terpisah untuk memeriksa apakah Pengguna dapat memposting komentar. Anda dapat menggunakan kembali ini sama seperti Anda berencana untuk menggunakan kembali layanan komentar.
Jika layanan komentar bertanggung jawab untuk memperbarui komentar pengguna , maka layanan Anda menjadi Pembaruan (Pengguna pengguna, Komentar komentar) dan Anda memiliki fleksibilitas untuk memeriksa aturan bisnis dalam layanan itu sendiri.
Sekarang setelah Anda jelas tentang apa maksud desain Anda, Anda akan memiliki kejelasan tentang bagaimana menerapkan solusi Anda.
sumber