大话设计模式--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容器来做.那么创建对象的时候,有可 ...
随机推荐
- pyhthon第一个小脚本——文件备份
先说说这个脚本的作用:对指定路径的文件进行压缩备份到另一个指定的路径,并且压缩文件的文件名用当时的日期+时间命名. 先是对着<简明Python教程>上的代码敲的,一堆错误,书上给的是lin ...
- Leetcode 122.买卖股票的最佳时机II
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多笔交易(你必须在再次 ...
- Spark在Executor上的内存分配
spark.serializer (default org.apache.spark.serializer.JavaSerializer ) 建议设置为 org.apache.spark.ser ...
- [luoguP1516] 青蛙的约会(扩展欧几里得)
传送门 对于数论只会gcd的我,也要下定决心补数论了 列出方程 (x + t * m) % l = (y + t * n) % l 那么假设 这两个式子之间相差 num 个 l,即为 x + t * ...
- [luoguP1901] 发射站(单调栈)
传送门 呵呵 ——代码 #include <cstdio> #include <iostream> #define N 1000010 #define LL long long ...
- [K/3Cloud]关于"选单"操作
之前有些人对这块有些疑问,比如: 1.选单操作是否和下推基本一样,都是公用同一套单据转换规则,只不过下推是源单推目标单,选单是目标单去选择源单,最终操作结果一样? 2,我想实现选单的时候,选单列表先通 ...
- I - 最少拦截系统
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; ],su ...
- C# 反射基础
反射的定义:审查元数据并收集关于它的类型信息的能力.元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等. 公共语言运 ...
- srvctl error
Hit an strange error just now. [oracle@racnode1 ~]$ srvctl # # An unexpected error has been detected ...
- mysql Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’
mysql Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ 今天在linux中安装了mys ...