-
-
Save tuannguyenssu/1ed76001b186c221b0afd8e8b16729f1 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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