10 KiB
🧩 ShiroginSDK Service Architecture (v1.0.0)
Modular • Service-Oriented • Event-Driven Core Framework
ShiroginSDK’nin servis çekirdeği, tüm SDK modüllerinin (IAP, Popup, Theme, Analytics, RemoteConfig vb.) tek merkezden yönetilmesini sağlayan soyut bir sistemdir.
Bu sistem, Unity projelerinde bağımlılık enjeksiyonu, servis yaşam döngüsü ve event forwarding gibi prensipleri uygular.
🧱 Temel Yapı
| Bileşen | Görev |
|---|---|
| IShiroginService | Her servisin uyması gereken temel sözleşme (interface) |
| ServiceBase | Ortak yaşam döngüsü (Initialize / Dispose) davranışını sağlar |
| ServiceLocator | Global erişim noktası, tüm servis örneklerini saklar |
| ShiroginServiceRegistry | Servislerin otomatik başlatılmasını ve kayıt edilmesini yönetir |
| IDataService, IEventService vb. | Özelleşmiş interface türleri (örnek: veri yönetimi, event yönetimi) |
⚙️ Mimarinin Amacı
- 🔁 Servislerin bağımlılıklarını merkezi olarak yönetmek
- 🧩 Servislerin birbiriyle loosely coupled (gevşek bağlı) çalışmasını sağlamak
- 🧠 Modül bazlı mimariyle SDK’nın kolay genişletilmesini mümkün kılmak
- 🧰 Editor araçları, runtime servisler ve sistem olaylarını tek lifecycle üzerinden yürütmek
🔄 Servis Yaşam Döngüsü
Tüm servisler aşağıdaki sırayla çalışır:
SDKInitializer
↓
ShiroginServiceRegistry.InitializeAll()
↓
ServiceLocator.Register<T>()
↓
OnInitialize() çağrısı
↓
EventService aracılığıyla sistem olayları
↓
OnDispose() (Oyun kapanışı veya reset)
🧠 1. IShiroginService
Tüm servislerin temel interface’i.
public interface IShiroginService
{
void Initialize();
void Dispose();
bool IsInitialized { get; }
}
Amaç: Her servisin başlatma ve temizleme rutinini standartlaştırmak.
🧩 2. ServiceBase
MonoBehaviour’e ihtiyaç duymadan servislerin yaşam döngüsünü yönetir.
Tüm custom servisler bu sınıftan türetilir.
public abstract class ServiceBase : IShiroginService
{
public bool IsInitialized { get; private set; }
public void Initialize()
{
if (IsInitialized) return;
OnInitialize();
IsInitialized = true;
}
public void Dispose()
{
OnDispose();
IsInitialized = false;
}
protected abstract void OnInitialize();
protected virtual void OnDispose() { }
}
🔹 Her servis
OnInitialize()veOnDispose()metodlarını override ederek kendi kurulum/temizlik işlemlerini yapar. 🔹DontDestroyOnLoadkullanımı veyaMonoBehaviourbağımlılığı olmadan çalışır.
🧭 3. ServiceLocator
Servislerin global erişim noktasını oluşturur.
İçerisinde tip güvenli bir dictionary tutar ve Get<T>() ile erişim sağlar.
var dataService = ServiceLocator.Get<IDataService>();
var eventService = ServiceLocator.Get<IEventService>();
Yeni servis kaydı:
ServiceLocator.Register<IDataService>(new DataService());
📌 ServiceLocator, Singleton yerine Dependency Injection felsefesine yakındır. Servislerin instance yönetimi
ShiroginServiceRegistrytarafından yapılır.
🏗️ 4. ShiroginServiceRegistry
Tüm servislerin oluşturulmasından, sırayla başlatılmasından ve kapatılmasından sorumludur.
public static class ShiroginServiceRegistry
{
public static void InitializeAll()
{
// ------------------------------------------------------------------
// 🧩 CORE LAYER
// ------------------------------------------------------------------
RegisterAndInit<IEventService>(new EventService()); // Events backbone
RegisterAndInit<IDataService>(new DataService()); // Save/Load system
RegisterAndInit<ICoroutineRunnerService>(new CoroutineRunnerService()); // Global coroutine executor
// ------------------------------------------------------------------
// 🔥 BACKEND LAYER
// ------------------------------------------------------------------
RegisterAndInit<IFirebaseService>(new FirebaseService()); // Firebase Analytics + Remote Config
RegisterAndInit<IRemoteConfigService>(new RemoteConfigService()); // Uses FirebaseService
RegisterAndInit<IAppsFlyerService>(new AppsFlyerService()); // AppsFlyer analytics SDK
RegisterAndInit<IFacebookService>(new FacebookService()); // Facebook SDK
RegisterAndInit<IAnalyticsService>(new AnalyticsService()); // Unified analytics forwarding
// ------------------------------------------------------------------
// 💰 ECONOMY & ADS
// ------------------------------------------------------------------
RegisterAndInit<IIAPService>(new IAPService()); // In-app purchases
RegisterAndInit<IAdsService>(new AdsService()); // Rewarded & Interstitial ads
// ------------------------------------------------------------------
// 🎨 UI / PRESENTATION LAYER
// ------------------------------------------------------------------
RegisterAndInit<IThemeService>(new ThemeService()); // UI themes / skins
RegisterAndInit<IPopupService>(new PopupService()); // Global popup queue system
UnityEngine.Debug.Log("[ShiroginSDK] ✅ All services initialized successfully.");
}
/// <summary>
/// Registers and initializes a service with its interface type.
/// </summary>
private static void RegisterAndInit<TInterface>(ServiceBase service) where TInterface : class
{
// Register by interface type
ServiceLocator.Register<TInterface>((TInterface)(object)service);
service.Initialize();
}
public static void DisposeAll()
{
ServiceLocator.Clear();
UnityEngine.Debug.Log("[ShiroginSDK] 🧹 All services disposed.");
}
}
✅ Servisler initialize sırasına göre çalışır, dispose’da ters sırayla kapanır. 🧩 Yeni servis eklemek yalnızca
RegisterAndInit<IPopupService>(new MyService());satırı eklemek kadar kolaydır.
🧩 5. Yeni Servis Oluşturma
Aşağıda yeni bir servis (örnek: AudioService) nasıl ekleneceği gösterilmiştir.
using ShiroginSDK.Runtime.Services.Base;
using ShiroginSDK.Runtime.Services.Interfaces;
using UnityEngine;
public class AudioService : ServiceBase, IAudioService
{
protected override void OnInitialize()
{
Debug.Log("[AudioService] Initialized");
// Audio mixer setup, volume cache, etc.
}
protected override void OnDispose()
{
Debug.Log("[AudioService] Disposed");
}
public void PlaySFX(string clipName)
{
// ...
}
}
Kayıt etmek için:
RegisterAndInit<IEventService>(new AudioService());
Artık global erişim mümkündür:
ServiceLocator.Get<IAudioService>().PlaySFX("coin_pickup");
⚙️ 6. Servis Arası Etkileşim
Her servis ServiceLocator aracılığıyla diğer servislere erişebilir:
protected override void OnInitialize()
{
var dataService = ServiceLocator.Get<IDataService>();
var eventService = ServiceLocator.Get<IEventService>();
eventService.Invoke(new GameStartedEvent());
}
Bu sayede servisler birbirine doğrudan bağımlı değil, aracılı çalışır. Bu yapı test edilebilirliği ve mock servis kullanımını kolaylaştırır.
🧠 7. İleri Konular
🔹 CoroutineRunnerService
MonoBehaviour bağlamında coroutine çalıştırmak için soyut bir arayüz sunar.
CoroutineRunner.Start(...) ile tüm SDK servisleri coroutine başlatabilir.
🔹 IDataService
Oyun verilerinin (BaseData) yönetimini sağlar: Get<T>(), SaveAll(), ToJson() vb.
🔹 IEventService
SDK genelinde event forwarding sağlar. Tüm servisler event’leri publish/subscribe ile paylaşır. Örneğin:
_eventService.Invoke(new ShiroginEvents.PurchaseCompletedEvent());
🔹 Extensibility (Genişletilebilirlik)
Yeni servisler yalnızca şu 3 adıma ihtiyaç duyar:
ServiceBase’ten türet- Gerekirse bir
IYourServiceinterface tanımla ShiroginServiceRegistry.Register(new YourService())çağrısı ekle
🔍 8. Debugging & Logging
Tüm servisler initialization sırasında log üretir.
Hatalar [ShiroginSDK] etiketiyle konsola basılır.
Örnek:
[PopupService] ✅ Initialized and bound to SDKConfig.
[ThemeService] 🌈 Active theme set to 'Snow'
[IAPService] 💳 Unity Purchasing initialized.
⚡ 9. Performans Notları
- Servisler
DontDestroyOnLoadveyaMonoBehaviourobjelerine bağlı değildir. - Tüm bağımlılıklar
ServiceLocatorüzerinden çözülür, böylece yükleme sırası kontrol altındadır. - Gereksiz singleton oluşturulmaz, yalnızca kullanılan servisler bellekte kalır.
🧾 10. Özet
| Özellik | Açıklama |
|---|---|
| 🔄 Lifecycle Yönetimi | ServiceBase ve ServiceRegistry üzerinden |
| 🧩 Bağımlılık Yönetimi | ServiceLocator ile type-safe çözüm |
| 🚀 Modüler Yapı | Her modül bağımsız servis olarak çalışır |
| 🧱 Event-Driven | IEventService ile sistem içi iletişim |
| ⚙️ Kolay Genişletme | 3 satırda yeni servis ekleme |
| 🧠 Test Edilebilir | Mock servislerle bağımsız testler yapılabilir |
Prepared by: Emir Han MAMAK
Version: 1.0.0 (2025.10)
Module: ShiroginSDK.Runtime.Services
📘 İpucu: Servis sisteminin amacı “oyun sistemleri arasındaki sınırları netleştirmek”tir. Bu yapıyı doğru kullandığında, SDK’nın her yeni modülü — IAP, Popup, RemoteConfig, Theme — sadece bir servis olarak eklenir. Böylece ShiroginSDK, Unity’nin üstünde kendi mini operating system’ini oluşturur.