using Microsoft.Extensions.DependencyInjection; namespace DependencyInjections { public class ImplementDependencyInjections { public void Implement() { ServiceCollection serviceCollection = new ServiceCollection(); serviceCollection.AddTransient(); serviceCollection.AddTransient(); serviceCollection.AddTransient(); // Byt de 2 udkommentering for at skrifte processor bool usePaypal = false; if (usePaypal) { serviceCollection.AddTransient(); } else { serviceCollection.AddTransient(); } serviceCollection.AddTransient(); serviceCollection.AddTransient(); serviceCollection.AddTransient(); serviceCollection.AddTransient(); var sp = serviceCollection.BuildServiceProvider(); sp.GetRequiredService().Log(); sp.GetRequiredService().process(); sp.GetRequiredService().SendNotification("Hello, There"); } } public interface ILogger { void Log(string message); } public class ConsoleLogger : ILogger { public void Log(string message) { Console.WriteLine(message); } } public class FileLogger : ILogger { public void Log(string message) { var currentPath = Directory.GetCurrentDirectory(); var path = Path.Combine(currentPath, "test.txt"); using (StreamWriter sw = File.AppendText(path)) { sw.WriteLine(message); } } } public class UserService { private readonly IEnumerable logger; public UserService(IEnumerable logger) { this.logger = logger; } public void Log() { foreach (var log in logger) { log.Log("Hello from user service"); } } } public interface IPaymentProcessor { void Process(decimal amount); } public class StripePaymentProcessor : IPaymentProcessor { public void Process(decimal amount) { Console.WriteLine($"Stripe processing for {amount}..."); } } public class PayPalPaymentProcessor : IPaymentProcessor { public void Process(decimal amount) { Console.WriteLine($"Paypal processing for {amount}..."); } } public class CheckoutService { private readonly IPaymentProcessor paymentProcessor; public CheckoutService(IPaymentProcessor paymentProcessor) { this.paymentProcessor = paymentProcessor; } public void process() { paymentProcessor.Process(5); } } public interface IEmailSender { void SendEmail(string to, string subject, string body); } public class ConsoleEmailSender : IEmailSender { public void SendEmail(string to, string subject, string body) { Console.WriteLine($"To: {to} subject: {subject} body: {body}"); } } public class SmtpEmailSender : IEmailSender { public void SendEmail(string to, string subject, string body) { Console.WriteLine($"SENDING EMAIL:: To: {to} subject: {subject} body: {body}"); } } public class NotificationService { private readonly IEnumerable emailSender; public NotificationService(IEnumerable emailSender) { this.emailSender = emailSender; } public void SendNotification(string message) { foreach (var sender in emailSender) { sender.SendEmail("test", "Notification", message); } } } }