تفاوت بین 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