# 📦 Proto & gRPC Complete Guide
> **آخرین بروزرسانی**: January 3, 2026
> **NuGet Server**: GitLab Package Registry
> **URL جدید**: `https://git.se.kbs1.ir/api/packages/FourSat/nuget/index.json`
---
## 📊 معماری Packaging
```
┌─────────────────────────────────────────────────────────────┐
│ LAYER 1: CMS Proto (Base) │
│ CMSMicroservice.Protobuf │
│ Version: 0.0.142+ → Auto-push به GitLab │
└─────────────────────────────────────────────────────────────┘
│
PackageReference
▼
┌─────────────────────────────────────────────────────────────┐
│ LAYER 2: BFF Protos │
│ BackOffice.BFF.*.Protobuf (24 packages) │
│ FrontOffice.BFF.*.Protobuf (packages) │
│ → Depend on: CMS Proto v0.0.x │
└─────────────────────────────────────────────────────────────┘
│
PackageReference / DLL Reference
▼
┌─────────────────────────────────────────────────────────────┐
│ LAYER 3: UI Applications │
│ BackOffice UI → libs/*.dll (24 DLLs) │
│ FrontOffice UI → FrontOffice.BFF Protos │
└─────────────────────────────────────────────────────────────┘
```
---
## ⚠️ قانون طلایی
**هر تغییر در Proto = این 3 مرحله اجباری:**
```bash
# 1️⃣ افزایش Version
X.Y.Z → X.Y.Z+1
# 2️⃣ Pack کردن
dotnet pack -c Release
# ✅ خودکار push میشه به GitLab
# 3️⃣ Update در لایه بالاتر
```
---
## 🔧 روشهای Reference در BackOffice
### روش 1: DLL Reference (Production/CI-CD) ✅ پیشنهادی
**مزایا**: مستقل از ریپوی BFF، مناسب CI/CD
```bash
# Build proto DLLs
cd BackOffice
./build-deps.sh
# DLLs در libs/ قرار میگیرند
ls libs/*.dll | wc -l # 24 DLL
```
**BackOffice.csproj**:
```xml
../../libs/BackOffice.BFF.Common.Protobuf.dll
```
---
### روش 2: ProjectReference (Development)
**مزایا**: تغییرات بلافاصله اعمال میشود
```xml
```
---
### روش 3: PackageReference (قدیمی)
**مزایا**: کنترل دقیق ورژن
```xml
```
**معایب**: نیاز به push به NuGet server
---
## 📝 اسکریپت build-deps.sh
**مسیر**: `/home/masoud/Apps/project/FourSat/BackOffice/build-deps.sh`
```bash
#!/bin/bash
# Build all BFF proto dependencies and copy DLLs to libs folder
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LIBS_DIR="$SCRIPT_DIR/libs"
BFF_PROTOS_DIR="$SCRIPT_DIR/../BackOffice.BFF/src/Protobufs"
echo "🔧 Building all proto dependencies..."
mkdir -p "$LIBS_DIR"
# All 24 proto projects
PROTO_PROJECTS=(
"BackOffice.BFF.Common.Protobuf"
"BackOffice.BFF.Category.Protobuf"
# ... (complete list)
)
for PROJECT in "${PROTO_PROJECTS[@]}"; do
PROJECT_DIR="$BFF_PROTOS_DIR/$PROJECT"
dotnet build "$PROJECT_DIR" -c Release --verbosity quiet
# Check both net9.0 and net8.0
if [ -f "$PROJECT_DIR/bin/Release/net9.0/$PROJECT.dll" ]; then
cp "$PROJECT_DIR/bin/Release/net9.0/$PROJECT.dll" "$LIBS_DIR/"
elif [ -f "$PROJECT_DIR/bin/Release/net8.0/$PROJECT.dll" ]; then
cp "$PROJECT_DIR/bin/Release/net8.0/$PROJECT.dll" "$LIBS_DIR/"
fi
done
echo "✅ Build complete! Total DLLs: $(ls $LIBS_DIR/*.dll | wc -l)"
```
---
## 🚀 Workflow توسعه
### Development (Local):
```bash
# Build با Debug config
cd BackOffice/src
dotnet build -c Debug
# اگر libs/ نباشد → از ProjectReference استفاده میشود
# تغییرات Proto بلافاصله اعمال میشود
```
### Production (Deploy):
```bash
# 1. Build proto DLLs
cd BackOffice
./build-deps.sh
# 2. Build & Publish
cd src
dotnet publish BackOffice/BackOffice.csproj -c Release -o ./publish
# 3. بررسی output
ls ./publish/wwwroot/_framework/*.wasm | grep "BackOffice.BFF" | wc -l
# Result: 24 ✅
```
---
## 📦 لیست Proto Projects
### BackOffice.BFF (24 پروژه)
| پروژه | Target Framework | وضعیت |
|-------|------------------|--------|
| BackOffice.BFF.Common.Protobuf | net9.0 | ✅ |
| BackOffice.BFF.Category.Protobuf | net9.0 | ✅ |
| BackOffice.BFF.ClubMembership.Protobuf | net9.0 | ✅ |
| BackOffice.BFF.Commission.Protobuf | net9.0 | ✅ |
| BackOffice.BFF.Configuration.Protobuf | net9.0 | ✅ |
| BackOffice.BFF.DiscountCategory.Protobuf | net9.0 | ✅ |
| BackOffice.BFF.DiscountOrder.Protobuf | net9.0 | ✅ |
| BackOffice.BFF.DiscountProduct.Protobuf | net9.0 | ✅ |
| BackOffice.BFF.DiscountShoppingCart.Protobuf | net9.0 | ✅ |
| BackOffice.BFF.Health.Protobuf | net9.0 | ✅ |
| BackOffice.BFF.Inventory.Protobuf | net9.0 | ✅ |
| BackOffice.BFF.ManualPayment.Protobuf | net9.0 | ✅ |
| BackOffice.BFF.NetworkMembership.Protobuf | net9.0 | ✅ |
| BackOffice.BFF.Otp.Protobuf | net9.0 | ✅ |
| BackOffice.BFF.Package.Protobuf | net9.0 | ✅ |
| BackOffice.BFF.Products.Protobuf | net9.0 | ✅ |
| BackOffice.BFF.ProductTag.Protobuf | net9.0 | ✅ |
| BackOffice.BFF.PublicMessage.Protobuf | **net8.0** | ✅ |
| BackOffice.BFF.Role.Protobuf | net9.0 | ✅ |
| BackOffice.BFF.Tag.Protobuf | net9.0 | ✅ |
| BackOffice.BFF.User.Protobuf | net9.0 | ✅ |
| BackOffice.BFF.UserAddress.Protobuf | net9.0 | ✅ |
| BackOffice.BFF.UserOrder.Protobuf | net9.0 | ✅ |
| BackOffice.BFF.UserRole.Protobuf | net9.0 | ✅ |
⚠️ **نکته**: `PublicMessage.Protobuf` تنها پروژه با `net8.0` است
---
## 🔧 تنظیمات csproj با Auto-Push
```xml
net9.0
Foursat.BackOffice.BFF.Products.Protobuf
1.0.0
FourSat
FourSat
true
./nupkg
$(PackageOutputPath)$(PackageId).$(Version).nupkg
dotnet nuget push **/*.nupkg --source https://git.se.kbs1.ir/api/packages/FourSat/nuget/index.json --api-key YOUR_API_KEY --skip-duplicate
```
---
## 🛠️ Troubleshooting
### مشکل: Version Conflict
**علامت**:
```
error NU1605: Detected package downgrade: Grpc.Core.Api from 2.71.0 to 2.54.0
```
**راهحل**:
```xml
```
---
### مشکل: Missing Transitive Dependencies
**علامت**:
```
CS0234: The type or namespace name 'Google' does not exist
```
**راهحل**: اضافه کردن dependencies در csproj:
```xml
```
---
### مشکل: DLL Not Found
**علامت**:
```
warning MSB3245: Could not resolve this reference
```
**راهحل**:
```bash
# Rebuild all proto DLLs
cd BackOffice
rm -rf libs/
./build-deps.sh
```
---
### مشکل: net8.0 vs net9.0
**علامت**: DLL یک پروژه کپی نشده
**راهحل**: اسکریپت `build-deps.sh` هر دو framework را چک میکند
---
## 📚 مراجع
- [gRPC for .NET](https://docs.microsoft.com/en-us/aspnet/core/grpc/)
- [Protocol Buffers](https://developers.google.com/protocol-buffers)
- [NuGet CLI Reference](https://docs.microsoft.com/en-us/nuget/reference/nuget-exe-cli-reference)