大话设计模式--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 372 Complete the Word(双指针)
codeforces 372 Complete the Word(双指针) 题链 题意:给出一个字符串,其中'?'代表这个字符是可变的,要求一个连续的26位长的串,其中每个字母都只出现一次 #incl ...
- noip模拟赛 whzzt-Conscience
分析:数据中并不存在无解的情况...... 每个摄像头都要覆盖尽可能多的点,按照y从小到大排序.对于每一列,只用判断第一个没有被观测到的就可以了,这个点必须要放摄像头,因为除了它自己没有其它的摄像头能 ...
- [UOJ48] 核聚变反应强度
QUQ 思路 求出a1的所有约数,与a1.ai放入同一数组: 求出gcd(a1,ai): 枚举约数,得出ans; 代码实现 #include<cmath> #include<cstd ...
- codevs1004 四子连棋
题目描述 Description 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋子,7颗黑色棋子,有两个空白地带,任何一颗黑白棋子都可以向上下左右四个方向移动到相邻的空格,这叫行棋一步,黑白双 ...
- 洛谷—— P2504 [HAOI2006]聪明的猴子
P2504 [HAOI2006]聪明的猴子 题目描述 在一个热带雨林中生存着一群猴子,它们以树上的果子为生.昨天下了一场大雨,现在雨过天晴,但整个雨林的地表还是被大水淹没着,部分植物的树冠露在水面上. ...
- Drools等规则引擎技术对比分析
项目中需要设计开发一个规则引擎服务,于是调研了业界常用的规则引擎. 常见的规则引擎如下: Ilog JRules 是最有名的商用BRMS: Drools 是最活跃的开源规则引擎: Jess 是Clip ...
- Ubuntu中PPA源是什么
以下内容转自https://imcn.me/ppa: PPA是Personal Package Archives首字母简写.翻译为中文意思是:个人软件包文档 只有Ubuntu用户可以用,而所有的PPA ...
- 递归删除目录下.svn文件
原文:http://imysqldba.blog.51cto.com/1222376/1104901 ------------------------------------------------- ...
- docker国内镜像拉取和镜像加速registry-mirrors配置修改
docker国内镜像拉取和镜像加速registry-mirrors配置修改 学习了:http://blog.csdn.net/u014231523/article/details/61197945 站 ...
- 大数据技术之Flume研究摘要(一)
Flume是Cloudera提供的一个高可用的,高可靠的.分布式的海量日志採集.聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据:同一时候,Flume提供对数据进行简单处理 ...