Skip to content

Instantly share code, notes, and snippets.

@tuannguyenssu
Created Jul 7, 2019
Embed
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)
{
_db.Save(orderId);
_log.LogInfo("Order has been checkout");
_es.SendEmail(userId);
}
}
// 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