windows服务 MVC之@Html.Raw()用法 文件流的读写 简单工厂和工厂模式对比
windows服务
public partial class Service1 : ServiceBase
{
System.Threading.Timer recordTimer;
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
// TODO: 在此处添加代码以启动服务。
IntialSaveRecord();
}
protected override void OnStop()
{
// TODO: 在此处添加代码以执行停止服务所需的关闭操作。
if (recordTimer != null)
{
recordTimer.Dispose();
}
}
/// <summary>
/// 定时检查,并执行方法
/// </summary>
/// <param name="source"></param>
/// <param name="e"></param>
private void IntialSaveRecord()
{
//10000毫秒=10秒
TimerCallback timerCallback = new TimerCallback(CallbackTask); //加载事件
AutoResetEvent autoEvent = new AutoResetEvent(false);
recordTimer = new System.Threading.Timer(timerCallback, autoEvent, 0, 1800000);//其中参数10000表示延时执行服务的时间间隔,毫秒为单位
或者(定时服务)
System.Timers.Timer t = new System.Timers.Timer();//实例化Timer类,设置间隔时间为1000毫秒;
t.Elapsed += new System.Timers.ElapsedEventHandler(OrderTimer_Tick);//到时间的时候执行事件;
t.AutoReset = true;//设置是执行一次(false)还是一直执行(true);
t.Interval=1000;
t.Enabled = true;//是否执行System.Timers.Timer.Elapsed事件;
}
//方法
private void CallbackTask(Object stateInfo)
{
WriteFile.SaveRecord(string.Format(@"dsc当前记录时间:{0},状况:程序运行正常!", DateTime.Now));
}
}
windows服务安装步骤:
1. cd C:\Windows\Microsoft.NET\Framework\v4.0.30319
2. InstallUtil.exe exe的路径
卸载:
InstallUtil.exe /u exe的路径
MVC之@Html.Raw()用法
@Html.Raw() 方法输出带有html标签的字符串,
如:@Html.Raw("<div style='color:red'>输出字符串</div>")
结果:输出字符串 (红色字体的字符串)
使用Razor中的Html.Raw(推荐使用这种方式)
文件流的读写
//读文件
public static string ReadFile()
{
string basePath = System.AppDomain.CurrentDomain.BaseDirectory;
string strTempDir = string.Format("{0}", DateTime.Now.ToString("yyyyMMdd"));
string path3 = Path.Combine(basePath, strTempDir);
FileStream fs = new FileStream(path3, FileMode.Open);
StreamReader sr = new StreamReader(fs,Encoding.UTF8);
string line = sr.ReadLine();//直接读取一行
sr.Close();
fs.Close();
return line;
}
public static string ReadFile(string sUrl)
{
StringBuilder builder = new StringBuilder();
using (FileStream fs = File.Open(sUrl, FileMode.OpenOrCreate))
{
using (StreamReader sr = new StreamReader(fs, Encoding.UTF8))
{
builder.Append(sr.ReadToEnd());
}
}
return builder.ToString();
}
//写文件
public static void WriteFile()
{
string basePath = System.AppDomain.CurrentDomain.BaseDirectory;
string strTempDir = string.Format("{0}", DateTime.Now.ToString("yyyyMMdd"));
string path3 = Path.Combine(basePath, strTempDir);
FileStream fs = new FileStream(path3, FileMode.Append);
StreamWriter sw = new StreamWriter(fs);
sw.WriteLine("hello world");
sw.Close();
fs.Close();//这里要注意fs一定要在sw后面关闭,否则会抛异常
}
简单工厂和工厂模式对比
一,工厂模式
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
二,介绍
意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
主要解决:主要解决接口选择的问题。
何时使用:我们明确地计划不同条件下创建不同实例时。
如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。
关键代码:创建过程在其子类执行。
应用实例:
1、您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。
2、Hibernate 换数据库只需换方言和驱动就可以。
优点:
1、一个调用者想创建一个对象,只要知道其名称就可以了。
2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
3、屏蔽产品的具体实现,调用者只关心产品的接口。
缺点:
每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
使用场景:
1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。
2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。
3、设计一个连接服务器的框架,需要三个协议,”POP3”、”IMAP”、”HTTP”,可以把这三个作为产品类,共同实现一个接口。
注意事项:
作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。
三,简单工厂模式
简单工厂模式包含以下3个角色:
- Factory(工厂角色)
- Product(抽象产品角色)
- ConcreteProduct(具体产品角色)
//典型的抽象产品类代码
abstract class Product
{
//所有产品类的公共业务方法
public void MethodSame()
{
//公共方法的实现
}
//声明抽象业务方法
public abstract void MethodDiff();
}
//典型的具体产品类代码
class ConcreteProductA : Product
{
//实现业务方法
public override void MethodDiff()
{
//业务方法的实现
}
}
class ConcreteProductB : Product
{
//实现业务方法
public override void MethodDiff()
{
//业务方法的实现
}
}
class Factory
{
//静态工厂方法
public Product GetProduct(string arg)
{
Product product = null;
if (arg.Equals("A"))
{
product = new ConcreteProductA();
//初始化设置product
}
else if (arg.Equals("B"))
{
product = new ConcreteProductB();
//初始化设置product
}
return product;
}
}
class Program
{
static void Main(string[] args)
{
Factory factory = new Factory();
Product product = factory.GetProduct("A");
product.MethodDiff();
}
}
在简单工厂模式中用于创建实例的方法有时候是静态(static)方法,因此有时候被称为静态工厂方法(Static Factory Method)模式
四,工厂方法模式
使用工厂方法模式改进后的按钮工厂:
使用工厂方法模式改进后的按钮工厂:
工厂方法模式:
- 不再提供一个按钮工厂类来统一负责所有产品的创建,而是将具体按钮的创建过程交给专门的工厂子类去完成。
- 如果出现新的按钮类型,只需要为这种新类型的按钮定义一个具体的工厂类就可以创建该新按钮的实例。
工厂方法模式的定义
简称为工厂模式(Factory Pattern)。
又可称作虚拟构造器模式(Virtual Constructor Pattern)或多态工厂模式(Polymorphic Factory Pattern)。
工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象。
目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。
工厂方法模式包含以下4个角色:
- Product(抽象产品)
- ConcreteProduct(具体产品)
- Factory(抽象工厂)
- ConcreteFactory(具体工厂)
//典型的抽象产品类代码
abstract class Product
{
//所有产品类的公共业务方法
public void MethodSame()
{
//公共方法的实现
}
//声明抽象业务方法
public abstract void MethodDiff();
}
//典型的具体产品类代码
class ConcreteProductA : Product
{
//实现业务方法
public override void MethodDiff()
{
//业务方法的实现
}
}
class ConcreteProductB : Product
{
//实现业务方法
public override void MethodDiff()
{
//业务方法的实现
}
}
//典型的抽象工厂类代码
interface Factory
{
Product FactoryMethod();
}
//典型的具体工厂类代码
class ConcreteAFactory : Factory
{
public Product FactoryMethod()
{
return new ConcreteProductA();
}
}
class ConcreteBFactory : Factory
{
public Product FactoryMethod()
{
return new ConcreteProductB();
}
}
class Program
{
static void Main(string[] args)
{
Factory factory = new ConcreteAFactory();
Product product = factory.FactoryMethod();
product.MethodDiff();
}
}
windows服务 MVC之@Html.Raw()用法 文件流的读写 简单工厂和工厂模式对比的更多相关文章
- Windows服务注册(需要指定config文件的情况下)
最近,遇到一个问题:需要将telegraf在Win平台下注册为windows服务(避免误操作关闭CMD窗口): 尝试了网上的几种注册Windows服务的方法,发现无法将telegraf这种需要在CMD ...
- C# 使用文件流来读写ini文件
背景 之前采用ini文件作为程序的配置文件,觉得这种结构简单明了,配置起来也挺方便.然后操作方式是通过WindowsAPI,然后再网上找到一个基于WindowsAPI封装的help类,用起来倒也顺手. ...
- C#文件流的读写
1.文件流写入的一般步骤 1.定义一个写文件流 2.定义一个要写入的字符串 3.完成字符串转byte数组 4.把字节数组写入指定路径的文件 5.关闭文件流 2.文件流读入的一般步骤 1.定义一个读文件 ...
- c#中文件流的读写
文件流读入:第一static void Main(string[] args) { //C#文件流写文件,默认追加FileMode.Append string msg = "okffffff ...
- node.js 从文件流中读写数据及管道流
读取数据 // 引入 fs 模块 const fs = require('fs'); // 创建可读流 let readStream = fs.createReadStream('index.txt' ...
- C# windows服务:如何获取服务程序所在的文件夹
AppDomain.CurrentDomain.BaseDirectory 就这么一句话
- 移动文件流的读写指针---fseek
函数原型:int fseek(FILE *stream,long offset,int origin) stream:文件指针, offset:偏移量,正数表示正向偏移,负数表示负向偏移.origin ...
- RDIFramework.NET框架SOA解(集Windows服务、WinForm形式和IIS发布形式)-分布式应用程序
RDIFramework.NET框架SOA解决方式(集Windows服务.WinForm形式与IIS形式公布)-分布式应用 RDIFramework.NET,基于.NET的高速信息化系统开发.整合框架 ...
- 玩转Windows服务系列——使用Boost.Application快速构建Windows服务
玩转Windows服务系列——创建Windows服务一文中,介绍了如何快速使用VS构建一个Windows服务.Debug.Release版本的注册和卸载,及其原理和服务运行.停止流程浅析分别介绍了Wi ...
随机推荐
- django的rest framework框架——安装及基本使用
一.django的FBV 和 CBV 1.FBV(基于函数的视图): urlpatterns = [ url(r'^users/', views.users), ] def users(request ...
- LA 4256 DP Salesmen
d(i, j)表示使前i个数满足要求,而且第i个数值为j的最小改动次数. d(i, j) = min{ d(i-1, k) | k == j | G[j][k] } #include <cstd ...
- HTML5 移动端web
概述 HTML5 提供了很多新的功能,主要有: 新的 HTML 元素,例如 section, nav, header, footer, article 等 用于绘画的 Canvas 元素 用于多媒体播 ...
- Python 多级目录选择+一键正反排序
效果如图所示,可以根据条件来选择对象 cat pc.py #!/usr/bin/pythonfrom flask import Flask,render_template,request,redire ...
- java编程思想阅读记录
第五章:初始化与清理 1.构造器确保初始化 构造器采用与类名相同的方法. 创建对象时,将会为对象分配存储空间,并调用相应的构造器.这就确保了在你能操作对象之前,它就已经恰当的被初始化了. 垃圾回收器负 ...
- NYOJ 995 硬币找零
硬币找零 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 在现实生活中,我们经常遇到硬币找零的问题,例如,在发工资时,财务人员就需要计算最少的找零硬币数,以便他们能从 ...
- Centos7 安装配置优化mysql(mariadb分支)
1.说明 由于在centos7的yum仓库中没有mysql,centos7用mariadb替代了mysql. mariadb是mysql源代码的一个分支, mysql被ORACLE闭源,而mariad ...
- 【JavaScript 11—应用总结】:下拉菜单
导读:在web页面的显示中,总是免不了下拉菜单的设置.怎样将菜单设置的更好玩一点呢?这次,就将实现一个下拉菜单的制作.当鼠标移入的时候,菜单显示,鼠标移走,菜单关闭. 一.实现分析 首先,制作一个下拉 ...
- PAT天梯赛练习题——L3-005. 垃圾箱分布(暴力SPFA)
L3-005. 垃圾箱分布 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 大家倒垃圾的时候,都希望垃圾箱距离自己比较近,但是谁 ...
- CI(CodeIgniter)框架中的增删改查操作
我们创建一个模型( 项目目录/models/),请注意:模型名与文件名相同且必须继承数据核心类CI_Model,同时重载父类中的构造方法 CodeIgniter的数据函数类在 \models\User ...