大话设计模式--DI(依赖注入)
1.背景
想象一个场景:有个功能通过某个参数决定了路由到不同的方法上或者几个方法模块可以自由搭配,咋办?一般人会对每个方法写一个helper(比如SendMessageForEmail、SendMessageForSMS).
2.分析
这样的方法可以吗?当然可以实现,而且跑起来压根没问题,如果你想让自己代码更好一点,更有结构更容易维护,你需要做一些事,用到DI依赖注入模式
3.代码
一般方法:
private bool callSendNote(int tenant_id, string app_id, string user_Id, string domamin,int sendNoteType,string email,string mobile)
{
var flagForEamil = true;
var flagForMobile = true;
//生成Url
var emailUrl = AuthorityHelper.GetUrl(tenant_id, app_id, user_Id, "", domamin);
var messageUrl = AuthorityHelper.GetUrl(tenant_id, app_id, user_Id, "", domamin);
var emailContent = BeisenNPSConfig.EmailContent;
var emailSubject = BeisenNPSConfig.EmailSubject;
var messageContent = BeisenNPSConfig.MessageContent; switch (sendNoteType) {
case :
if (!string.IsNullOrEmpty(email))
{
flagForEamil = MailSendHelper.SendMail("ue@beisen.com", "北森", new string[] { email }, string.Format(emailContent, domamin, emailUrl, emailUrl, emailUrl, domamin), emailSubject);
}
break;
case :
if (!string.IsNullOrEmpty(mobile))
{
var smsMessage = new List<SMSMessage>() { new SMSMessage() { Phone = mobile, Message = string.Format(messageContent, messageUrl) } };
flagForMobile = SMSSendHelper.SendSms(smsMessage);
}
break;
case :
if (!string.IsNullOrEmpty(email))
{
flagForEamil = MailSendHelper.SendMail("ue@beisen.com", "北森", new string[] { email }, string.Format(emailContent, domamin, emailUrl, emailUrl, emailUrl, domamin), emailSubject);
}
if (!string.IsNullOrEmpty(mobile))
{
var smsMessage = new List<SMSMessage>() { new SMSMessage() { Phone = mobile, Message = string.Format(messageContent, messageUrl) } };
flagForMobile = SMSSendHelper.SendSms(smsMessage);
}
break;
default:break;
}
return (flagForEamil && flagForMobile);
}
两个helper:
public class MailSendHelper
{
#region Fields
static readonly ILog Logger = Logging.LogWrapper.GetLogger(MethodBase.GetCurrentMethod().DeclaringType.FullName);
#endregion
public static bool SendMail(string from, string displayName, string[] to, string body, string subject, int TenantId = , string TenantName = "北森", string SystemId = "PlatformSHMail")
{
try
{
Logger.ErrorFormat("开始发送邮件! count:{0}=====>detail:{1}", to.Count(), string.Join(",", to)); if (string.IsNullOrEmpty(from)) from = "italent@italent.cn";
MailBatch batch = new MailBatch();
batch.SystemId = SystemId;
batch.TenantId = TenantId;
batch.TenantName = TenantName;
batch.Title = subject;
batch.MailMessages = new MailMessageCollection();
batch.CalendarType = CalendarMail.Normal;
batch.EMailType = EmailType.Normal;
batch.Cancel = false;
foreach (var item in to)
{
if (!string.IsNullOrEmpty(item))
batch.MailMessages.Add(new MailMessage()
{
Body = body,
Subject = subject,
Priority = MailPriority.Normal,
IsUseTemplate = false,
IsBodyHtml = true, From = new MailAddress()
{
Address = from,
DisplayName = displayName
},
To = new MailAddressCollection()
{
new MailAddress()
{
Address = item,
DisplayName = item
}
}
});
}
batch.Update = false;
var batch_id = SMSMailProvider.Mail_SendMailByBatch(batch);
if (!string.IsNullOrEmpty(batch_id))
{
Logger.Debug("邮件发送成功!batch_id:" + batch_id);
return true;
}
else
return false;
}
catch (Exception ex)
{
Logger.Error(string.Format("邮件发送失败! tenantId:{0}=====>to:{1}", TenantId, string.Join(",", to)), ex);
return false;
}
}
#region Properties
public static ISMSMailProvider SMSMailProvider
{
get
{
return ESBDynamicProxy.GetInstance<ISMSMailProvider>();
}
}
#endregion
}
public class SMSSendHelper
{
#region Fields
static readonly ILog Logger = Logging.LogWrapper.GetLogger(MethodBase.GetCurrentMethod().DeclaringType.FullName);
#endregion
public static bool SendSms(IEnumerable<SMSMessage> smsMessageList, int TenantId = , string TenantName = "北森", string SystemId = "CommonPIN", string SolutionName = "UPaas")
{
//Todo:批量一次只能发一万条
try
{
Logger.Error(string.Format("开始发送短信! count:{0}=====>detail:{1}", smsMessageList.Count(),Newtonsoft.Json.JsonConvert.SerializeObject(smsMessageList))); SMSBatch batch = new SMSBatch();
batch.ShortMessages = new MessageCollection { };
foreach (var smsMessage in smsMessageList)
{
if (string.IsNullOrEmpty(smsMessage.Phone)) { continue; }
//判断短信内容是否为黑词
string black = "";
bool isExist = ArgumentHelper.CheckBlackWord(smsMessage.Message, out black);
if (isExist == true)
{
string[] blacks = black.Split(',');
foreach (var blackWord in blacks)
{
smsMessage.Message = smsMessage.Message.Replace(blackWord, "");
}
}
if (smsMessage.Message.Length >= )
{
smsMessage.Message = smsMessage.Message.Substring(, ) + "......";
}
var msg = new ShortMessage
{
MessageText = smsMessage.Message,
PhoneNumber = smsMessage.Phone
};
batch.ShortMessages.Add(msg);
} batch.SystemId = SystemId;
batch.TenantId = TenantId;
batch.TenantName = TenantName;
batch.SolutionName = SolutionName;
ArgumentHelper.IsValid(batch, true);
string batchId = SMSMailProvider.SMS_SendSMSAnyTime(batch); if (string.IsNullOrEmpty(batchId))
{
return false;
}
else
{
return true;
}
}
catch (Exception ex)
{
Logger.Error(string.Format("短信发送失败! tenantId:{0}=====>detail:{1}", TenantId, Newtonsoft.Json.JsonConvert.SerializeObject(smsMessageList)), ex);
} return true;
} #region Properties
public static ISMSMailProvider SMSMailProvider
{
get
{
return ESBDynamicProxy.GetInstance<ISMSMailProvider>();
}
}
#endregion
}
如果使用依赖注入的话
则是:
首先创建个接口,就是两个模块的抽象,ISendNoteService
public interface ISendNoteService
{
void SendMesssage(BaseAgrs agrs);
} public class BaseAgrs
{
public int tenant_id { get; set; }
public string app_id { get; set; }
public string user_Id { get; set; }
public string domamin { get; set; }
public int sendNoteType { get; set; }
public string email { get; set; }
public string mobile { get; set; } public string TenantId { get; set; }
public string TenantName { get; set; }
public string SystemId { get; set; }
}
两个模块服务类都有
ISendNoteService这个接口构造函数注入
如下:
SendEmailService类:
public class SendEmailService
{
private ISendNoteService _iSendNoteService;
public SendEmailService(ISendNoteService _sendNoteService)
{
_iSendNoteService = _sendNoteService;
} public void SendMessage(EmailAgrs agrs)
{
_iSendNoteService.SendMesssage(agrs);
}
}
public class EmailAgrs:BaseAgrs
{
public string from { get; set; }
public string displayName { get; set; }
public string[] to { get; set; }
public string body { get; set; }
public string subject { get; set; }
}
SendSMService类:
public class SendSMService
{
private ISendNoteService _iSendNoteService;
public SendSMService(ISendNoteService _sendNoteService)
{
_iSendNoteService = _sendNoteService;
} public void SendMessage(MobileAgrs agrs)
{
_iSendNoteService.SendMesssage(agrs);
}
}
public class MobileAgrs : BaseAgrs
{
public IEnumerable<SMSMessage> smsMessageList { get; set; }
}
在调用的过程中,构造好不同的model后,直接再provider调用不同的service即可
大话设计模式--DI(依赖注入)的更多相关文章
- 大话DI依赖注入+IOC控制反转(一) 之 定义
转发时请注明原创作者及地址,否则追究责任.原创:alunchen 依赖注入与控制反转 依赖注入与控制反转是老生常谈的问题.一般面试也会面试到这种问题.网上很多很多这方面的资料,搜索出来一大堆 ...
- DI依赖注入/IOC控制反转
DI依赖注入# 啥都不说,直接上代码 <?php class UserController { private $user; function __construct(UserModel $us ...
- 轻松学,浅析依赖倒置(DIP)、控制反转(IOC)和依赖注入(DI) 依赖注入和控制反转的理解,写的太好了。
轻松学,浅析依赖倒置(DIP).控制反转(IOC)和依赖注入(DI) 2017年07月13日 22:04:39 frank909 阅读数:14269更多 所属专栏: Java 反射基础知识与实战 ...
- 三大框架 之 Spring(IOC控制反转、DI依赖注入)
目录 常用词汇 left join与left outer join的区别 Struts2的标签库导入 Spring Spring概述 什么是Spring spring特点 下载 IOC 什么IOC 传 ...
- .net 温故知新:【7】IOC控制反转,DI依赖注入
IOC控制反转 大部分应用程序都是这样编写的:编译时依赖关系顺着运行时执行的方向流动,从而生成一个直接依赖项关系图. 也就是说,如果类 A 调用类 B 的方法,类 B 调用 C 类的方法,则在编译时, ...
- 初识Spring框架实现IOC和DI(依赖注入)
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的, IoC是 ...
- 谈谈php里的IOC控制反转,DI依赖注入
理论 发现问题 在深入细节之前,需要确保我们理解"IOC控制反转"和"DI依赖注入"是什么,能够解决什么问题,这些在维基百科中有非常清晰的说明. 控制反转(In ...
- IoC控制反转与DI依赖注入
IoC控制反转与DI依赖注入 IoC: Inversion of Control IoC是一种模式.目的是达到程序的复用.下面的两篇论文是对IoC的权威解释: InversionOfControl h ...
- Spring详解(三)------DI依赖注入
上一篇博客我们主要讲解了IOC控制反转,也就是说IOC 让程序员不在关注怎么去创建对象,而是关注与对象创建之后的操作,把对象的创建.初始化.销毁等工作交给spring容器来做.那么创建对象的时候,有可 ...
随机推荐
- 【Codeforces 490C】Hacking Cypher
[链接] 我是链接,点我呀:) [题意] 让你把一个字符串分成左右两个部分 形成两个正数 使得这两个正数一个能被a整除,一个能被b整除 找到任意一个解就可以 [题解] 枚举分割的断点i 枚举的时候用同 ...
- 抽象类和接口有什么区别---https://blog.csdn.net/csdn_aiyang/article/details/71171886
https://blog.csdn.net/csdn_aiyang/article/details/71171886 概念] 抽象类.具体类是相对的,并非绝对的.抽象是一种概念性名词,具体是一种可 ...
- HDU 1254 条件过程复杂的寻找最短路
这里一看就是找箱子到终点的最短路 一开始还傻傻的以为人的位置给的很没有意思- -,然后果然错了 没过多久想明白了错误,因为你推箱子并不是你想去哪里推就能去哪推的,首先得考虑人能否过的去,因为可能人被箱 ...
- 为什么Java使用System.getenv()获取刚刚设置的环境变量时为空
场景: 在Ubuntu下已经启动了Eclipse,然后通过终端设置了环境变量(export $ENV=123),然后通过System.getenv()获取时显示为空. 解释: 环境变量仅在进程树下方, ...
- Python实例--C#执行Python脚本,传参
# -*- coding: utf-8 -*- # 第一行的目的,是为了让代码里面,可以有中文注释信息. (否则要运行报错) # 这个 Python 脚本, 用于被 C# 来调用. # 简单测试 He ...
- Yocto tips (17): Yocto License问题:restricted license not whitelisted in LICENSE_FLAGS_WHITELIST
Yocto中能够配置一个Distrbution的License.然后全部的软件包,都须要符合这个license才干够被shipped到image中,假设我们须要使用违反此license的软件包,那么就 ...
- QT如何修改编程语言的字体
工具-选项,然后在文本编辑器中设置要的字体
- PhoneGap3+版本号的安装、配置和使用[图]
如若转载.请注明博文地址及原作者(RisingWonderland). PhoneGap2+版本号最高为2.9.1,从3+版本号開始,PhoneGap官方不再提供下载安装包,须要在联网状态下.通过No ...
- Cisco VPP(1) 简单介绍
一.简单介绍 VPP全称Vector Packet Processing.是Cisco2002年开发的商用代码. 2016年2月11号,Linux基金会创建FD.io项目.Cisco将VPP代码的开源 ...
- MCU低功耗设计(三)产品
关键词: 低功耗设计, 无线通信产品, LoRa长距离, Contiki系统, 能耗实时跟踪 引言: 能耗对电池供电的产品来说是一个重大问题.一旦电能耗尽设备将"罢工".在< ...