Merancang aplikasi layanan modular


11

Saya sedang mencari solusi baru yang sifatnya sangat modular dan ingin membuat struktur yang mendukung desain itu untuk memudahkan ekspansi di masa depan, pemisahan masalah yang jelas, perizinan berdasarkan modul, dll. Sebagian besar dari apa yang saya miliki ditemukan di web tentang aplikasi modular atau komposit UI-sentris, berfokus pada Silverlight, WPF, dll. Dalam kasus saya, saya mengembangkan aplikasi layanan WCF yang akan dikonsumsi oleh pengembang lain yang bekerja pada berbagai proyek UI.

Latar Belakang

Tujuan dari proyek saya adalah untuk menciptakan sumber logika bisnis / domain terpusat untuk mendukung beberapa aplikasi bisnis kami yang saat ini menduplikasi proses, aturan, dll. Dan sementara tidak semua manfaat modularitas akan tercapai, saya ingin memanfaatkan kesempatan untuk membangun kerangka kerja yang akan memanfaatkan bagian-bagian yang dapat kita manfaatkan.

Saya sudah memulai desain dengan melihat API yang diekspos oleh aplikasi layanan. Jelas bahwa layanan dapat dipisahkan sepanjang garis modular yang saya pertimbangkan. Misalnya, saya akan memiliki layanan FinanceService, InventoryService, PersonnelService, dll. Yang mengelompokkan operasi layanan saya untuk memberikan kohesi yang tinggi dalam API sambil menjaga sambungan tetap rendah sehingga klien hanya perlu mengonsumsi layanan yang berkaitan dengan aplikasi mereka.

Masuk akal bagi saya bahwa saya kemudian dapat memiliki modul terpisah untuk masing-masing layanan ini, seperti MyApp.Finance, MyApp.Inventory, My.Personnel dan sebagainya. Masalah lintas sektoral dan tipe bersama akan ada di majelis bersama MyApp. Dari sini saya sedikit terikat.

(Oh, saya harus menyebutkan bahwa saya akan menggunakan wadah IoC untuk Dependency Injection untuk menjaga aplikasi tetap digabungkan. Saya tidak akan menyebutkan yang mana karena saya tidak ingin membuka kotak Pandora!)

Di MyApp.ServiceHost, saya akan membuat file host layanan (.svc) yang sesuai dengan setiap modul, FinanceService.svc misalnya. Host layanan memerlukan nama layanan yang sesuai dengan informasi dalam file konfigurasi yang berisi antarmuka yang mendefinisikan kontrak layanan. Konfigurasi IoC kemudian digunakan untuk memetakan implementasi konkret dari antarmuka yang akan digunakan.

1. Haruskah lapisan layanan mengimplementasikan API dan mendelegasikan ke modul atau haruskah modul mandiri (dalam arti mengandung semua yang terkait dengan modul itu, termasuk implementasi layanan)?

Salah satu cara untuk mendekati masalah adalah memiliki "modul" MyApp.Services yang berisi implementasi kontrak layanan. Setiap kelas layanan hanya mendelegasikan ke kelas lain di modul yang sesuai yang berisi logika domain untuk operasi. Misalnya, kelas FinanceService WCF di MyApp.Services mendelegasikan ke antarmuka lain yang diimplementasikan dalam modul Keuangan untuk melaksanakan operasi. Ini akan memungkinkan saya untuk mempertahankan fasad layanan yang tipis dan 'plug-in' implementasi ke implementasi layanan dan menghilangkan kebutuhan modul untuk khawatir tentang WCF, misalnya.

Di sisi lain, mungkin lebih disukai untuk memiliki setiap modul mandiri karena memiliki antarmuka dan implementasinya. Host layanan merujuk ke antarmuka kontrak layanan yang ditemukan dalam modul dan IoC dikonfigurasi untuk menggunakan implementasi yang sesuai dari modul juga. Ini berarti bahwa menambahkan modul baru dapat dilakukan tanpa perubahan pada lapisan layanan selain menambahkan file .svc baru dan informasi konfigurasi IoC.

Saya sedang memikirkan dampaknya jika saya beralih dari standar WCF ke antarmuka layanan yang tenang atau mungkin pergi ke layanan RIA atau sesuatu. Jika setiap modul berisi implementasi kontrak layanan, maka saya harus membuat perubahan di setiap modul jika saya mengubah teknologi atau pendekatan layanan. Tetapi, jika fasad adalah modulnya sendiri, maka saya hanya perlu menukar bagian itu untuk melakukan perubahan. Modul-modul kemudian harus mengimplementasikan kontrak (antarmuka) yang berbeda, mungkin ditentukan dalam perakitan bersama ???

2. Apa cara terbaik untuk menangani sumber daya berbagi antar modul dan / atau dependensi antar modul?

Ambil, misalnya, operasi Penerimaan. Pada blush on pertama masuk akal bahwa ini masuk ke modul Persediaan karena menerima barang adalah fungsi persediaan. Namun, ada juga aspek keuangan yang mengharuskan kita menghasilkan Tanda Terima dan mengesahkan pembayaran.

Di satu sisi, saya akan berharap untuk menggunakan beberapa jenis peristiwa / pesan domain untuk mengkomunikasikan operasi. Modul Inventaris memunculkan GoodsReceivedEvent yang ditangani oleh modul Keuangan untuk menghasilkan Kwitansi dan memulai proses pembayaran. Namun, ini berarti bahwa modul Keuangan perlu tahu tentang item inventaris yang diterima. Saya hanya dapat merujuk mereka dengan ID tetapi bagaimana jika saya membutuhkan informasi tambahan untuk Kwitansi, seperti nama dan / atau deskripsi, biaya unit, dll? Apakah masuk akal bagi setiap modul untuk memiliki versi mereka sendiri dari item inventaris yang dirancang sesuai dengan kebutuhan modul itu? Dalam hal itu, modul Keuangan harus melakukan pencarian sendiri atas barang-barang inventaris ketika menangani GoodsReceivedEvent.

...

Saya menggunakan contoh ini dengan sengaja karena saya telah banyak bekerja dengan berbagai sistem ERP dan tahu mereka dirancang dengan jenis modularitas ini - saya hanya tidak tahu caranya. Saya juga tidak secara eksplisit menyebutkannya di atas, tetapi saya lebih memilih untuk mengikuti prinsip-prinsip Desain Domain Driven dalam merancang solusi dan percaya bahwa jenis modularitas ini pas untuk area tersebut.

Setiap bantuan membuat kepala saya melilit ini sangat dihargai.


1
Maaf. Tidak dapat menemukan pertanyaan dalam semua pemikiran. Apa pertanyaannya?
S.Lott

1
Cari tanda tanya. Ada beberapa poin di mana saya menawarkan opsi tetapi tidak menganggap solusi dan beberapa pertanyaan spesifik untuk membantu memandu proses di jalan yang benar.
SonOfPirate

1
@SonOfPirate: Maaf. Saya berharap Anda dapat meluangkan waktu untuk menyoroti atau menekankan pertanyaan sehingga orang lain dapat membantu Anda.
S.Lott

4
Saya setuju dengan S.Lott. Maaf, tapi ini bukan pertanyaan, ini aliran kesadaran. Kami dapat membantu Anda jauh lebih baik jika Anda memadatkannya menjadi satu atau dua pertanyaan terfokus, dan mencoba untuk memisahkan masalah arsitektur dari detail implementasi.
Aaronaught

1
@SonOfPirate: "Arsitektur" adalah tentang struktur dan mengkomunikasikan struktur itu kepada pengembang lain. Dimulai dengan deskripsi. Itu harus mencapai tingkat kejelasan dan transparansi yang memungkinkan pengembang lain untuk benar-benar "mendapatkannya" dan mengikuti prinsip-prinsip desain arsitektur dalam semua yang mereka lakukan.
S.Lott

Jawaban:


2

Apakah masuk akal bagi setiap modul untuk memiliki versi mereka sendiri dari item inventaris yang dirancang sesuai dengan kebutuhan modul itu? Dalam hal itu, modul Keuangan harus melakukan pencarian sendiri atas barang-barang inventaris ketika menangani GoodsReceivedEvent. Di mana saya menarik garis antara modularitas dan kebutuhan untuk berbagi informasi?

Anda harus selalu menerima kompromi. Itu semua yang ada untuk mengatakan pertanyaan Anda benar-benar. Merupakan praktik yang baik untuk menjaga entitas dalam majelis terpisah, sehingga banyak aplikasi menyimpannya di perpustakaan bersama. Tetapi itu berarti bahwa tidak ada batasan bisnis-logis (fisik). Melakukan pencarian sendiri berarti banyak kode berlebihan yang hanya akan saya terapkan jika Anda memiliki persyaratan khusus di kedua modul. Tentu saja, jika dilihat dari sudut pandang arsitektur, Modul Keuangan Anda dan Modul Inventaris Anda tetap harus berbagi ketergantungan. Modul Keuangan kemungkinan besar tergantung pada Modul Persediaan. Jika persyaratan memungkinkan Anda untuk membiarkan satu modul bergantung pada modul lain, maka saya akan mengatakan tidak apa-apa untuk merangkum entitas dalam modul yang paling mereka miliki. Kamu' Saya perlu menemukan keseimbangan yang baik antara perbedaan fisik (ketergantungan bersama) dan pemeliharaan. Terlalu banyak dependensi bersama dapat menyebabkan mimpi buruk pemeliharaan versi. Juga, dengan ORM akan ada masalah jika Anda ingin memetakan hubungan baru ke entitas yang ada atau memperpanjang mereka dari modul yang bergantung pada modul yang mengandung entitas.

Jika Anda tidak menggunakan ORM maka ingatlah semua modul Anda mungkin memiliki basis data yang sama, seperti yang sering terjadi. Anda bisa menggunakannya sebagai landasan bersama.

Anda juga dapat menyimpan data polos (dalam hal CSV / hasil misalnya) dan menggunakan layanan pesan pusat untuk memberi tahu modul yang terdaftar untuknya tentang data baru bersama dengan beberapa informasi meta. Itu berarti tidak ada dependensi nyata, tetapi pengorbanan ketik keselamatan dan kontrak dan mungkin ada masalah dengan data cacat. Saya kira begitu banyak sistem ERP besar yang melakukannya.

Jadi singkatnya, Anda harus memutuskan jenis antarmuka yang Anda inginkan. Lebih banyak modularitas menyebabkan lebih sedikit kontrak dan sebaliknya.

Saya dapat menggunakan pustaka bersama untuk objek data saya dan layanan perpesanan pusat dengan pola pelanggan terbitkan, yang tampaknya merupakan solusi terbaik bagi saya.


Setuju juga dengan ini - perpesanan + pub / sub dan pustaka bersama untuk kontrak dto (internal nuget repo). Saya bertanya-tanya pertanyaan yang sama dengan @SonOfPirate sampai artikel ini menempatkannya dalam perspektif untuk saya: msdn.microsoft.com/en-us/library/bb245678.aspx
diegohb
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.