大话设计模式--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容器来做.那么创建对象的时候,有可 ...
随机推荐
- 52. spring boot日志升级篇—log4j多环境不同日志级别的控制【从零开始学Spring Boot】
在上一章节中我们介绍了,仅通过log4j-spring.properties对日志级别进行控制,对于需要多环境部署的环境不是很方便,可能我们在开发环境大部分模块需要采用DEBUG级别,在测试环境可能需 ...
- Codeforces Round #240 (Div. 2) C Mashmokh and Numbers
, a2, ..., an such that his boss will score exactly k points. Also Mashmokh can't memorize too huge ...
- hdu 3062 2-sat
#include<stdio.h> #include<string.h> #define N 2100 struct node { int u,v,next; }bian[N* ...
- [K/3Cloud]如何解决kdpkg无法部署到业务站点的问题
自从下载了sp1后,就迫不急待的试用下,看看反馈的几个关键bug是否修复,可惜sp1安装后发现业务站点下的组件一个都没有被更新,这指定是有问题了,这真是让哥百思不得其解,真后悔在研发时没仔细研究下部署 ...
- Android: MediaRecorder start failed
在某些机型上,MediaRecorder在调用start方法时,会出现start failed的错误,有一种可能是setVideoFrameRate导致的.要解决这个问题,只需要注释掉这条语句就可以了 ...
- python列表可以加可以乘
python列表可以加可以乘 list=['abcd',786,2.23,'runoob',70.2] tinylist = [123,'runoob'] print(list) print(list ...
- 【Cocos2dx游戏开发】CCTableView实现滑动列表
在游戏中,经常需要用到列表展示,例如我现在做的卡牌游戏中就有卡牌列表和好友列表需要用到CCTableView,下面简单介绍一下使用方法. CCTableView位于扩展库文件cocos-ext.h中, ...
- PhoneGap3+版本号的安装、配置和使用[图]
如若转载.请注明博文地址及原作者(RisingWonderland). PhoneGap2+版本号最高为2.9.1,从3+版本号開始,PhoneGap官方不再提供下载安装包,须要在联网状态下.通过No ...
- 还在自建Redis缓存?那你就out了
Redis 是什么?简单来说,Redis是一个开源的内存数据库,支持Key-Value等多种数据结构,可用于缓存.事件发布或订阅.高速队列等场景.Redis使用ANSIC语言编写,支持网络,提供字符串 ...
- linux下使用script和scriptreplay对命令行操作进行录像
转自:linux下用script和scriptreplay对命令行操作录像 在Linux中可以使用script命令来记录命令行的操作过程,并使用scriptreplay命令对命令操作进行回放,操作步骤 ...