Sobes.tech
Middle+

Servis bulucu nedir?

sobes.tech yapay zeka

AI'dan gelen yanıt

Service Locator, belirli görevleri yerine getiren nesneler (servisler) için küresel erişim noktası sağlayan bir tasarım desenidir ve istemci kodunun bu servislerin uygulama türlerini bilmesini gerektirmez. Gerekli servisi alma sürecini kapsüller.

Service Locator’ın avantajları:

  • Merkezi erişim: Uygulamanın herhangi bir yerinden servislere erişimi kolaylaştırır.
  • Esneklik: Servislerin uygulamalarını kolayca değiştirmeye olanak tanır, istemci kodunu değiştirmeden.

Service Locator’ın dezavantajları (kritiklerin ana nedeni):

  • Gizli bağımlılıklar: İstemci kodu bağımlılıklarını açıkça belirtmez, bu da hangi servislerin gerekli olduğunu anlamayı zorlaştırır.
  • Test edilebilirlik: Service Locator kullanan sınıfları test etmek zordur, çünkü bağımlılıkların kolayca taklit edilmesi (mocking) mümkün değildir.
  • Bağımlılıkların tersine çevrilmesi ilkesinin (DIP) ihlali: Bağımlılıkları yapıcı veya özellikler aracılığıyla almak yerine, sınıf aktif olarak talep eder.
  • Yaşam döngüsü yönetiminde zorluklar: Service Locator, kayıtlı servislerin yaşam döngüsünü yönetemez (örneğin, singleton veya transient nesneler oluşturmak gibi).

Basit bir uygulama örneği:

public static class ServiceLocator
{
    private static Dictionary<Type, object> _services = new Dictionary<Type, object>();

    public static void RegisterService<TService>(TService serviceInstance) where TService : class
    {
        if (_services.ContainsKey(typeof(TService)))
        {
            throw new InvalidOperationException($"{typeof(TService).Name} türündeki servis zaten kayıtlı.");
        }
        _services[typeof(TService)] = serviceInstance;
    }

    public static TService GetService<TService>() where TService : class
    {
        if (_services.TryGetValue(typeof(TService), out object service))
        {
            return (TService)service;
        }
        throw new InvalidOperationException($"{typeof(TService).Name} türündeki servis bulunamadı.");
    }
}

Kullanım örneği:

// Servisin kaydı
ServiceLocator.RegisterService<ILogger>(new ConsoleLogger());

// Servisin alınması
ILogger logger = ServiceLocator.GetService<ILogger>();
logger.LogInfo("Hello, Service Locator!");

Modern C# geliştirmelerinde, Service Locator genellikle Inversion of Control (IoC) konteynerleri kullanımıyla değiştirilir; bu konteynerler, bağımlılıkların açıkça beyan edilmesini ve otomatik olarak enjekte edilmesini sağlayan tam bir Dependency Injection (DI) sunar. Bu yaklaşım, bağımlılıkların yönetimi ve kodun test edilebilirliğinin artırılması için daha tercih edilir bir yöntemdir. IoC konteynerleri, DIP ilkelerine uygun olarak bağımlılıkları açıkça beyan etmeye ve otomatik olarak enjekte etmeye imkan tanır.