Skip to content

Instantly share code, notes, and snippets.

Created Jul 7, 2019
What would you like to do?
// Interface
public interface IDatabase
void Save(int orderId);
public interface ILogger
void LogInfo(string info);
public interface IEmailSender
void SendEmail(int userId);
// Các Module implement các Interface
public class Logger : ILogger
public void LogInfo(string info) {}
public class Database : IDatabase
public void Save(int orderId) {}
public class EmailSender : IEmailSender
public void SendEmail(int userId) {}
public class Cart
private readonly IDatabase _db;
private readonly ILogger _log;
private readonly IEmailSender _es;
public Cart(IDatabase db, ILogger log, IEmailSender es)
_db = db;
_log = log;
_es = es;
public void Checkout(int orderId, int userId)
_log.LogInfo("Order has been checkout");
// Khi sử dụng không dùng DI container
//Dependency Injection một cách đơn giản nhất
Cart myCart = new Cart(new Database(),new Logger(), new EmailSender());
//Khi cần thay đổi database, logger
myCart = new Cart(new XMLDatabase(),new FakeLogger(), new FakeEmailSender());
// Khi sử dụng dùng DI container (Thực tế ta dùng cách này)
//Với mỗi Interface, ta define một Module tương ứng
DIContainer.SetModule<IDatabase, Database>();
DIContainer.SetModule<ILogger, Logger>();
DIContainer.SetModule<IEmailSender, EmailSender>();
DIContainer.SetModule<Cart, Cart>();
//DI Container sẽ tự inject Database, Logger vào Cart
var myCart = DIContainer.GetModule();
//Khi cần thay đổi, ta chỉ cần sửa code define
DIContainer.SetModule<IDatabase, XMLDatabase>();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment