三层架构 业务应用划分

    三层架构,通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。区分层次的目的即为了“高内聚,低耦合”的思想。

一、英文拓展:

    三层架构(3-Tier ASrchitecture)

    表现层UI(User Interface)

    业务逻辑层BLL(Business Logic Layer)

    数据访问层DAL(Data Access Layer)

 

二、各层作用解析:

  1、DAL作用:

    1)从数据源加载数据Select

    2)向数据源写入数据Insert/Update

    3)从数据源删除数据Delete

2、UI的作用:

    1)向用户展现特定业务数据。

    2)采集用户的输入信息和操作。

    3)特定的数据显示给用户

  原则:用户至上,界面简洁明了

  3、BLL的作用:

    1)从DAL中获取数据,供UI显示用。

    2)从UI中获取用户指令和数据,执行业务逻辑。

    3)从UI中获取用户指令和数据,通过DAL写入数据源。

  BLL的职责机制:

    UI——BLL——UI

    UI——BLL——DAL——BLL——UI

4、数据模型的引入:

    为了避免三层之间的互相引用,所以出现Model,用于传输数据的,业务数据模型

 

三、系统登陆实例,步骤:

1、新建数据库

(名称)LoginDemo,包含两张表:

新建表Users

      

  其中,设定ID为主键,自增长。

新建表Scores

     

  其中,设定ID为主键,自增长。

2、编码阶段:

    解决方案名称:LoginSolution

    位置:LoginDemo

1)DAL数据访问层:

    新建项目名称:LoginDAL

    默认命名空间:Login.DAL

    添加类:UserDAO,ScoreDAO,DbUtil

    引用:LoginModel

复制代码
namespace Login.DAL
{
    class DbUtil
    {
        //sever机器名,Database数据库名,
        public static string ConnString = @"Server=192.168.**.**;Database=LoginDemo;User ID=sa;Password=123456";    
    }
}

//每成功登陆一次用户,增加10点积分。
    public  class ScoreDAO
    {
        public void UpdateScore(string userName, int value)
        {
            using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))
            {
                SqlCommand cmd = conn.CreateCommand();
                cmd.CommandText = @"INSERT INTO SCORES(UserName,Score) Values (@UserName,@Score)";
                
                cmd.Parameters.Add(new SqlParameter("@UserName", userName));
                cmd.Parameters.Add(new SqlParameter("@Score", value));

                conn.Open();
                cmd.ExecuteNonQuery();
            }
        }
    }

public  class UserDAO
    {
        //根据userName和password返回一个布尔值。
        public Login.Model.UserInfo SelectUser(string userName, string password)
        {
            {
                //有了using以后,connection就可以自动关闭 了
                SqlConnection conn=new SqlConnection (DbUtil .ConnString );
                {
                    SqlCommand cmd=conn.CreateCommand ();
                    cmd.CommandText=@"SELECT ID,UserName,Password,Email FROM USERS WHERE UserName=@UserName AND Password=@Password";
                    cmd.CommandType=CommandType .Text;
                    cmd.Parameters.Add(new SqlParameter ("@UserName",userName));
                    cmd.Parameters.Add(new SqlParameter ("@Password",password));

                    conn.Open();
                    SqlDataReader reader = cmd.ExecuteReader();
                    
                    //设置user的默认值为null
                    Login.Model .UserInfo user=null;
                    while (reader.Read())
                    {
                        if (user==null )
                         {
                            //如果user是null的话,则延迟加载
                             user=new Login .Model .UserInfo ();
                         }
                        user.ID=reader.GetInt32(0);
                        user.UserName=reader.GetString(1);
                        user.Password=reader.GetString(2);//not suggestion

                        //如果Email不是null的话,才可以去读。
                        if (!reader.IsDBNull(3))
                        {   
                             user.Email=reader.GetString(3);
                        }
            
                    }
                    return user;

                }
            }
        }
    
}
复制代码

 

2)UI表示层:

    添加新项目,Windows窗体应用程序。

    名称:LoginUI ,设置为启动项目

    默认命名空间:Login.UI

    引用:LoginBLL,LoginModel

 

   登陆:btnLogin

    用户名:(Name):txtUserName

    密码: (Name):txtPassword; PasswordChar:*

    窗体: Text:系统登陆; MaximizeBox:False; MinimizeBox:False; FormBorderStyle:FixedSingle

 

复制代码
namespace LoginUI
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }


        private void btnLogin_Click(object sender, EventArgs e)
        {  
            ////通常,直接使用DAO呼叫数据库。
            //IDbConnection conn = new SqlConnection("c....");
            //IDbCommand cmd = conn.CreateCommand();
            //cmd.CommandText = "Select UserName From USERS WHERE .....";
            //cmd.ExecuteReader();

        //利用三层架构,需要引用下一层的
            string userName = txtUserName.Text.Trim();
            string password = txtPassword.Text;
            Login.BLL.LoginManager mgr = new Login.BLL.LoginManager();
           Login.Model .UserInfo user= mgr.UserLogin(userName, password);

           MessageBox.Show("登陆用户:"+user.UserName );
        }
    }
}
复制代码

 

 

 

3)BLL业务逻辑层:

   添加新项目;

    名称:LoginBLL

    默认命名空间:Login.BLL

    添加新类:LoginManager/LoginService服务

    引用:LoginDAL,LoginModel

复制代码
namespace Login.BLL
{
    public class LoginManager
    {
        public Login.Model.UserInfo UserLogin(string userName, string password)
         {
             //throw new NotImplementedException();   
            //呼叫数据源,获取相应数据
             Login.DAL.UserDAO uDao = new Login.DAL.UserDAO();
             Login.Model.UserInfo user = uDao.SelectUser(userName, password);
             if (user != null)//login successful
             {
                 //如果登陆成功,则增加10点积分。
                 Login.DAL.ScoreDAO sDao = new Login.DAL.ScoreDAO();
                 sDao.UpdateScore(userName, 10);
                 return user;
             }
             else
             {
                 throw new Exception("登陆失败。");
             }
          }
    }
}
复制代码

4)Modle数据模型:

  添加新建项目:

    名称:LoginModel

    默认命名空间:Login.Model

    添加类:UserInfo

    Model数据模型:是独立于其余层次的,不知道其余层次的信息,其余层次都会引用Model。介于UI和BLL,此处表示我们想要返回的数据为USER对象。

 

复制代码
namespace Login.Model
{
    public  class UserInfo
    {
        public int ID { get; set; }
        public string UserName { get; set; }
        public string Password { get; set; }
        public string Email { get; set; }
    }
}
### RT-DETRv3 网络结构分析 RT-DETRv3 是一种基于 Transformer 的实时端到端目标检测算法,其核心在于通过引入分层密集正监督方法以及一系列创新性的训练策略,解决了传统 DETR 模型收敛慢和解码器训练不足的问题。以下是 RT-DETRv3 的主要网络结构特点: #### 1. **基于 CNN 的辅助分支** 为了增强编码器的特征表示能力,RT-DETRv3 引入了一个基于卷积神经网络 (CNN) 的辅助分支[^3]。这一分支提供了密集的监督信号,能够与原始解码器协同工作,从而提升整体性能。 ```python class AuxiliaryBranch(nn.Module): def __init__(self, in_channels, out_channels): super(AuxiliaryBranch, self).__init__() self.conv = nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1) self.bn = nn.BatchNorm2d(out_channels) def forward(self, x): return F.relu(self.bn(self.conv(x))) ``` 此部分的设计灵感来源于传统的 CNN 架构,例如 YOLO 系列中的 CSPNet 和 PAN 结构[^2],这些技术被用来优化特征提取效率并减少计算开销。 --- #### 2. **自注意力扰动学习策略** 为解决解码器训练不足的问题,RT-DETRv3 提出了一种名为 *self-att 扰动* 的新学习策略。这种策略通过对多个查询组中阳性样本的标签分配进行多样化处理,有效增加了阳例的数量,进而提高了模型的学习能力和泛化性能。 具体实现方式是在训练过程中动态调整注意力权重分布,确保更多的高质量查询可以与真实标注 (Ground Truth) 进行匹配。 --- #### 3. **共享权重解编码器分支** 除了上述改进外,RT-DETRv3 还引入了一个共享权重的解编码器分支,专门用于提供密集的正向监督信号。这一设计不仅简化了模型架构,还显著降低了参数量和推理时间,使其更适合实时应用需求。 ```python class SharedDecoderEncoder(nn.Module): def __init__(self, d_model, nhead, num_layers): super(SharedDecoderEncoder, self).__init__() decoder_layer = nn.TransformerDecoderLayer(d_model=d_model, nhead=nhead) self.decoder = nn.TransformerDecoder(decoder_layer, num_layers=num_layers) def forward(self, tgt, memory): return self.decoder(tgt=tgt, memory=memory) ``` 通过这种方式,RT-DETRv3 实现了高效的目标检测流程,在保持高精度的同时大幅缩短了推理延迟。 --- #### 4. **与其他模型的关系** 值得一提的是,RT-DETRv3 并未完全抛弃经典的 CNN 技术,而是将其与 Transformer 结合起来形成混合架构[^4]。例如,它采用了 YOLO 系列中的 RepNCSP 模块替代冗余的多尺度自注意力层,从而减少了不必要的计算负担。 此外,RT-DETRv3 还借鉴了 DETR 的一对一匹配策略,并在此基础上进行了优化,进一步提升了小目标检测的能力。 --- ### 总结 综上所述,RT-DETRv3 的网络结构主要包括以下几个关键组件:基于 CNN 的辅助分支、自注意力扰动学习策略、共享权重解编码器分支以及混合编码器设计。这些技术创新共同推动了实时目标检测领域的发展,使其在复杂场景下的表现更加出色。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值