تفاوت بین TryAddSingleton و AddSingleton در Asp.Net Core

برای عدم جایگزینی پیاده سازی های مختلف از Try استفاده میکنیم .

فرض کنید از یک اینترفیس (قرارداد : Contract) در برنامه چند پیاده‎ سازی مختلف دارید برای مثال :

public interface IMessage
{
  void Message();
}

و پیاده سازی های زیر را در نظر بگیرید :

public class Telegram: IMessage
{
  public void Message
  {
    Console.WriteLine("Weclome to telegram");
  }
}

public class WhatsAppMessage : IMessage
{
  public void Message
  {
    Console.WriteLine("Weclome to whatsapp");
  }
}

زمانی که هر 2 این پیاده سازی را در Container با AddSingleton رجیستر میکنید همیشه آخرین سرویس رجیستر شده (Registration) بعنوان پیاده سازی شده (Implementation) موقع Inject کردن به شما بازگشت داده می شود :

services.AddSingleton<IMessage, TelegramMessage>();
services.AddSingleton<IMessage, WhatsAppMessage>(); // ‘replaces’ TelegramMessage

IMessagemessage = container.GetService<IMessage>(); // resolves WhatsAppMessage

در این صورت زمانی که بخواهیم اگر پیاده سازی برای یک اینترفیس رجیستر شده بود و با پیاده سازی جدید جایگزین نشود باید از Try استفاده کنیم :

services.TryAddSingleton<IMessage, TelegramMessage>(); // add TelegramMessage
services.TryAddSingleton<IMessage, WhatsAppMessage>(); // does not add WhatsAppMessage, because of TelegramMessageexistence

IMessagemessage = container.GetService<IMessage>(); // resolves WhatsAppMessage

معادل این دستور در Di Container های دیگری مثل AutoFac دستور PreserveExistingDefaults  می باشد .

در آخر اگر میخواهید تمام پیاده سازی های یک اینترفیس را داشته باشید میتوانید یک IEnumerable از اون Type را تزریق (inject) کنید .

IEnumerable<IMessage> message = container.GetService<IEnumerable<IMessage>>(); // resolves [TelegramMessage, WhatsAppMessage