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(依赖注入)的更多相关文章

  1. 大话DI依赖注入+IOC控制反转(一) 之 定义

    转发时请注明原创作者及地址,否则追究责任.原创:alunchen 依赖注入与控制反转      依赖注入与控制反转是老生常谈的问题.一般面试也会面试到这种问题.网上很多很多这方面的资料,搜索出来一大堆 ...

  2. DI依赖注入/IOC控制反转

    DI依赖注入# 啥都不说,直接上代码 <?php class UserController { private $user; function __construct(UserModel $us ...

  3. 轻松学,浅析依赖倒置(DIP)、控制反转(IOC)和依赖注入(DI) 依赖注入和控制反转的理解,写的太好了。

    轻松学,浅析依赖倒置(DIP).控制反转(IOC)和依赖注入(DI) 2017年07月13日 22:04:39 frank909 阅读数:14269更多 所属专栏: Java 反射基础知识与实战   ...

  4. 三大框架 之 Spring(IOC控制反转、DI依赖注入)

    目录 常用词汇 left join与left outer join的区别 Struts2的标签库导入 Spring Spring概述 什么是Spring spring特点 下载 IOC 什么IOC 传 ...

  5. .net 温故知新:【7】IOC控制反转,DI依赖注入

    IOC控制反转 大部分应用程序都是这样编写的:编译时依赖关系顺着运行时执行的方向流动,从而生成一个直接依赖项关系图. 也就是说,如果类 A 调用类 B 的方法,类 B 调用 C 类的方法,则在编译时, ...

  6. 初识Spring框架实现IOC和DI(依赖注入)

    学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的, IoC是 ...

  7. 谈谈php里的IOC控制反转,DI依赖注入

    理论 发现问题 在深入细节之前,需要确保我们理解"IOC控制反转"和"DI依赖注入"是什么,能够解决什么问题,这些在维基百科中有非常清晰的说明. 控制反转(In ...

  8. IoC控制反转与DI依赖注入

    IoC控制反转与DI依赖注入 IoC: Inversion of Control IoC是一种模式.目的是达到程序的复用.下面的两篇论文是对IoC的权威解释: InversionOfControl h ...

  9. Spring详解(三)------DI依赖注入

    上一篇博客我们主要讲解了IOC控制反转,也就是说IOC 让程序员不在关注怎么去创建对象,而是关注与对象创建之后的操作,把对象的创建.初始化.销毁等工作交给spring容器来做.那么创建对象的时候,有可 ...

随机推荐

  1. Maven学习总结(29)——Maven项目的pom.xml中log4j2配置

        <dependency>         <groupId>org.apache.logging.log4j</groupId>         <a ...

  2. zoj 2110 很好的dfs+奇偶剪枝

    //我刚开始竟然用bfs做,不断的wa,bfs是用来求最短路的而这道题是求固定时间的 //剪纸奇偶剪枝加dfs #include<stdio.h> #include<queue> ...

  3. [K/3Cloud]K3Cloud平台开发之Python插件

    有时候我们的表单可能很简单,只是一个简单交互的表单,但有可能还是要劳师动众的给它建个工程写个插件,是不是很不爽?例如我有如下一个表单: 功能很简单就是选个业务对象,收集绑定几个字段名,然后确定返回一个 ...

  4. [国家集训队2010]小Z的袜子

    ★★★   输入文件:hose.in   输出文件:hose.out   简单对比 时间限制:1 s   内存限制:512 MB [题目描述] 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜 ...

  5. java多线程编程核心技术(二)--对象及变量的并发访问

    1.方法内部的私有变量是线程安全的,实例变量是线程不安全的. 2.A线程先持有object对象的lock锁,B线程可以以异步的方式调用object对象中的非synchronized类型的方法. 3.A ...

  6. kendo grid dropdownlist 联动 cascading

    之前是无法联动的 后来将html页面中的 //$('<input required data-text-field="CompanyName" data-value-fiel ...

  7. Mysql修改自增主键的起始值及查询自增主键的下一个值

    MySQL [xxx_mall]> alter table shop_base_info  AUTO_INCREMENT=11000;Query OK, 0 rows affected (0.0 ...

  8. CI session 类的用法

    最近使用codeingiter框架,发现默认的session 不是很好用,以下是用法总结:使用的是2.0.2的版本 1.扩展自带的session类:application/libraries/MY_s ...

  9. CocoaAsyncSocket网络通信使用之数据编码和解码(二)

    CocoaAsyncSocket网络通信使用之数据编码和解码(二) 在上一篇CocoaAsyncSocket网络通信使用之tcp连接(一)中,我们已经利用CocoaAsyncSocket封装了自己的s ...

  10. Ubuntu下安装C/C++开发环境【!!!有更新!!!Ubuntu14.10下使用eclipse搭建C语言开发环境】

    (1)第一步安装Eclipse,有两种方法,使用软件市场搜索就可以得到,安装就可以 另外一种是使用终端安装,命令例如以下: sudo su进入root模式 输入password 然后 输入:sudo ...