三层02

C#
本文总阅读量:
  1. 1. ado.net使用事务
  • 分层
  • 单例模式
  • 通过dotnet发送邮件
  • ado.net使用事务

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    string constr = "";
    using (SqlConnection con = new SqlConnection(constr))
    {
    con.Open();
    using (SqlTransaction tran = con.BeginTransaction())
    {
    using (SqlCommand cmd = new SqlCommand("sql", con))
    {
    cmd.Transaction = tran;
    cmd.ExecuteNonQuery();
    cmd.CommandText = "sql";
    cmd.Parameters.Clear();
    cmd.Parameters.AddRange(null);
    cmd.ExecuteNonQuery();
    }
    //tran.Commit();无异常提交
    tran.Rollback();//异常回滚
    }

    }

    分层

    理解分层:
    逻辑分层N-Layer
    ​ 逻辑上将系统中的不同功能模块、不同子系统等进行分层
    ​ 好的逻辑分层可以让后续选择物理架构更灵活,选择性更大
    ​ 我们学习的”三层架构”属于逻辑分层(three-layer)
    物理分层N-Tier
    ​ 物理部署时将系统的不同模块部署在不同的服务器上

    三层架构

    ​ 界面层UI;
    ​ 数据访问层DAL(Data Access Layer);
    ​ 业务逻辑层BLL(business logic layer )

    三层结构的程序不是说把项目分成DAL,BLL,WebUI三个模块就叫三层了,下面几个问题在你的项目里面:
    ⒈ UILayer里面只有少量(或者没有)SQL语句或者存储过程调用,并且这些语句保证不会修改数据?
    ⒉ 如果把UILayer拿掉,你的项目还能在Interface/API的层次上提供所有功能吗?
    ⒊ 你的DAL可以移植到其他类似环境的项目吗?
    ⒋ 三个模块,可以分别运行于不同的服务器吗?
    如果不是所有答案都为YES,那么你的项目还不能算是严格意义上的三层程序. 三层程序有一些需要约定遵守的规则:
    ⒈ 最关键的,UI层只能作为一个外壳,不能包含任何业务逻辑(BizLogic)的处理过程
    ⒉ 设计时应该从BLL出发,而不是UI出发. BLL层在API上应该实现所有BizLogic,以面向对象的方式
    ⒊ 不管数据层是一个简单的SqlHelper也好,还是带有Mapping过的Classes也好,应该在一定的抽象程度上做到系统无关
    ⒋ 不管使用COM+(Enterprise Service),还是Remoting,还是WebService之类的远程对象技术,不管部署的时候是不是真的分别部署到不同的服务器上,最起码在设计的时候要做这样的考虑,更远的,还得考虑多台服务器通过负载均衡作集群
    所以考虑一个项目是不是应该应用三层/多层设计时,先得考虑下是不是真的需要? 实际上大部分程序就开个WebApplication就足够了,完全没必要作的这么复杂. 而多层结构,是用于解决真正复杂的项目需求的。

    单例模式

    构造函数变私有,通过静态方法只创建同一个对象,本质控制该类对象的创建

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    public class Singleton
    {
    private static Singleton _instance;

    private static readonly object syn = new object();

    //1.当把类的构造函数设置为private的以后,则该类不能在外界被new了。
    private Singleton()
    {

    }
    //2.在当前类型中创建一个静态方法,用该静态方法来返回一个对象
    public static Singleton CreateInstance()
    {

    lock (syn)
    {
    if (_instance==null)
    {
    _instance = new Singleton();
    }
    }


    return _instance;
    }
    }

    通过dotnet发送邮件

    创建mail对象

    1
    2
    3
    var mail = new MailMessage();
    mail.From=new MailAddress("1023354041@qq.com", "luox78");
    mail.To.Add(new MailAddress("1023354041@qq.com", "luox78"));

    创建正文,主题等

    1
    2
    3
    mail.Subject = "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$4关于一些问题$$$$$$$$$$$$$$$$$$$$$$4";
    mail.SubjectEncoding = Encoding.UTF8;
    mail.Body = "<h1>hello</h1><font color=\"red\">^_^</font>";

    登录

    1
    2
    3
    4
    SmtpClient client = new SmtpClient("smtp.qq.com",587);//腾讯邮箱
    client.EnableSsl = true;//启用SSL加密
    //发件人邮箱账号,授权码(注意此处,是授权码你需要到qq邮箱里点设置开启Smtp服务,然后会提示你第三方登录时密码处填写授权码)
    client.Credentials = new System.Net.NetworkCredential("1023354041@qq.com", "授权码");

    发送

    1
    client.Send(mail);

    加附件

    1
    2
    3
    4
    MailMessage msg=new MailMessage();
    msg.Attachments.Add(attach1);
    msg.Attachments.Add(attach2);
    msg.Attachments.Add(attach3);

    加图片

    1
    2
    3
    4
    5
    6
    7
    8
    9
    AlternateView av = AlternateView.CreateAlternateViewFromString("<img src=\"cid:neirongid\"/><h1>hello</h1><font color=\”red\“>^_^</font>”, Encoding.UTF8, "text/html");
    //【这里需要注意:src="cid:neirongid"】

    LinkedResource lr = new LinkedResource(@"c:\a.jpg", "image/gif");
    lr.ContentId = “neirongid”;【这里需要注意设置ContentId=“neirongid”】
    av.LinkedResources.Add(lr);

    MailMessage msg = new MailMessage();
    msg.AlternateViews.Add(av);