一个简单的依赖倒置/依赖注入(Dependency Injection)的例子
2014-03-04 15:15
253 查看
一个简单的依赖倒置/依赖注入(Dependency Injection)的例子
1.
一个邮件发送程序
2.
增加一个日志功能
现在MailService具有2个职责,发送邮件和记录日志。
3.
把日志的实现细节分离出去。
现在可以日志功能的变更就分离到ConsoleLogger里面了。比如换成Windows Event Log方法记录日志。
4.
现在假设要根据开发环境和生产环境,分别用不同的Logger。比如开发环境用ConsoleLogger,生产环境用EventLogger。
接口
通过构造函数参数,MailService不依赖任何一个具体的Logger类,无论怎样对日志功能的修改,都不影响MailService。
public MailService(ILogger logger)
{
this.logger = logger;
}MailService不再关心Logger类的创建,只负责使用日志类提供的功能。
1.
一个邮件发送程序
class MailService { public void SendEmail(string address, string subject, string body) { var mail = new MailMessage(); mail.To.Add(address); mail.Subject = subject; mail.Body = body; var client = new SmtpClient(); // Setup client with smtp server address and port here client.Send(mail); } }
2.
增加一个日志功能
class MailService { public void SendMail(string address, string subject, string body) { Console.WriteLine("Creating mail message..."); var mail = new MailMessage(); mail.To.Add(address); mail.Subject = subject; mail.Body = body; var client = new SmtpClient(); // Setup client with smtp server address and port here Console.WriteLine("Sending message..."); client.Send(mail); Console.WriteLine("Message sent successfully."); } }
现在MailService具有2个职责,发送邮件和记录日志。
3.
把日志的实现细节分离出去。
class MailService { private ConsoleLogger logger; public MailService() { logger = new ConsoleLogger(); } public void SendMail(string address, string subject, string body) { logger.Log("Creating mail message..."); var mail = new MailMessage(); mail.To.Add(address); mail.Subject = subject; mail.Body = body; var client = new SmtpClient(); // Setup client with smtp server address and port here logger.Log("Sending message..."); client.Send(mail); logger.Log("Message sent successfully."); } }
class ConsoleLogger { public void Log(string message) { Console.WriteLine("{0}: {1}", DateTime.Now, message); } }
现在可以日志功能的变更就分离到ConsoleLogger里面了。比如换成Windows Event Log方法记录日志。
4.
现在假设要根据开发环境和生产环境,分别用不同的Logger。比如开发环境用ConsoleLogger,生产环境用EventLogger。
class EventLogger { public void Log(string message) { EventLog.WriteEntry("MailService", message); } }
接口
interface ILogger { void Log(string message); }
class ConsoleLogger:ILogger { public void Log(string message) { Console.WriteLine("{0}: {1}", DateTime.Now, message); } }
class EventLogger:ILogger { public void Log(string message) { EventLog.WriteEntry("MailService", message); } }
通过构造函数参数,MailService不依赖任何一个具体的Logger类,无论怎样对日志功能的修改,都不影响MailService。
public MailService(ILogger logger)
{
this.logger = logger;
}MailService不再关心Logger类的创建,只负责使用日志类提供的功能。
internal class Program { private static void Main(string[] args) { var mailService = new MailService(new EventLogger()); mailService.SendMail("someone@somewhere.com", "My first DI App", "Hello World!"); } }
相关文章推荐
- 一个简单的例子说明java中spring框架的依赖注入
- 一个简单的例子说明java中spring框架的依赖注入
- 一个简单的例子说明java中spring框架的依赖注入
- WCF 一步一步从入门到精通 建立一个简单入门的例子(适合一点不会的朋友阅读)
- Android 驱动跟系统开发 1. 一个简单的例子
- CFX WebService做的一个简单的HelloWorld例子 也可与spring 整合 发布在容器里面
- 简单的并发编程中犯2的一个小例子--CAS使用时一定要考虑下是否有必要做轮询
- [C++] Windows下的socket编程(这是一个简单的TCP/IP例子)
- 关于ExpandableListView用法的一个简单小例子
- 使用boost线程的一个简单的例子
- 一个简单的上传文件测试例子
- Android中关于ExpandableListView用法的一个简单小例子
- Windows azure-AppFabric 一个简单的ServiceBus例子
- 一个简单的hibernate连接oracle数据库例子
- Spring Ajax一个简单例子
- PhpMyAdmin的简单安装和一个mysql到Redis迁移的简单例子
- GDB 7.0 中文手册 —— 1. GDB简介和一个简单的使用例子
- 一个简单ALV的例子
- golang信号处理及一个简单例子实现