.Net基础1

news2024/11/25 0:52:16

.NET框架

项目结构

在这里插入图片描述

  • Connected Services是第三方服务
  • MVC框架
  • appsettings.json配置文件
  • Program.cs控制台应用程序
  • Properties里的json文件是配置启动方式

1. 基本开发

在这里插入图片描述

出现这个bug是因为防火墙没有把浏览器加入白名单,可以暂时先用http启动代替

  • 第一步创建控制器(请求映射路径就是文件夹和文件名)
  • 第二步在该控制器右键新建视图
  • 启动
  • 数据返回方式
//控制器
public IActionResult Index()
{
    ViewBag.User1 = "张三";
    ViewData["User2"] = "李四";
    TempData["User3"] = "王五";
    HttpContext.Session.SetString("User4", "赵六");
    object User5 = "田七";
    return View(User5);
}
//视图
@{
    ViewData["Title"] = "Hello,World";
}
@Model String
<h2>User1=@ViewBag.User1</h2>
<h2>User2=@ViewData["User2"]</h2>
<h2>User3=@TempData["User3"]</h2>
<h2>User4=@Context.Session.GetString("User4")</h2>
<h2>User5=@Model</h2>
//如果不配置Session服务就会报错
//到Program里面配置
builder.Service.AddSession();
var app = builder.Build();
app.UseSession();

2.日志log4net组件整合

导入依赖包

  • 右键 => 管理解决方案
    在这里插入图片描述

  • 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 另外还要安装第二个组件Log4Net.AspNetCore

  • 可以在依赖项里看到安装好的包

配置文件

  • 文件结构(XML):<Log4Net,,>

    • <?xml version="1.0" encoding="utf-8"?>
      <log4net>
      	<!-- Define some output appenders -->
      	<appender name="rollingAppender" type="log4net.Appender.RollingFileAppender">
      		<file value="log4\log.txt" />
      		<!--追加日志内容-->
      		<appendToFile value="true" />
      
      		<!--防止多线程时不能写Log,官方说线程非安全-->
      		<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
      
      		<!--可以为:Once|Size|Date|Composite-->
      		<!--Composite为Size和Date的组合-->
      		<rollingStyle value="Composite" />
      
      		<!--当备份文件时,为文件名加的后缀-->
      		<datePattern value="yyyyMMdd.TXT" />
      
      		<!--日志最大个数,都是最新的-->
      		<!--rollingStyle节点为Size时,只能有value个日志-->
      		<!--rollingStyle节点为Composite时,每天有value个日志-->
      		<maxSizeRollBackups value="20" />
      
      		<!--可用的单位:KB|MB|GB-->
      		<maximumFileSize value="3MB" />
      
      		<!--置为true,当前最新日志文件名永远为file节中的名字-->
      		<staticLogFileName value="true" />
      
      		<!--输出级别在INFO和ERROR之间的日志-->
      		<filter type="log4net.Filter.LevelRangeFilter">
      			<param name="LevelMin" value="ALL" />
      			<param name="LevelMax" value="FATAL" />
      		</filter>
      		<layout type="log4net.Layout.PatternLayout">
      			<conversionPattern value="%date [%thread] %-5level %logger - %message%newline"/>
      		</layout>
      	</appender>
      
      	<!--SqlServer形式-->
      	<!--log4net日志配置:http://logging.apache.org/log4net/release/config-examples.html -->
      	<appender name="AdoNetAppender_SqlServer" type="log4net.Appender.AdoNetAppender">
      		<!--日志缓存写入条数 设置为0时只要有一条就立刻写到数据库-->
      		<bufferSize value="0" />
      		<connectionType value="System.Data.SqlClient.SqlConnection,System.Data.SqlClient, Version=4.6.1.3, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
      		<connectionString value="Data Source=PC-202206030027;Initial Catalog=LogManager;Persist Security Info=True;User ID=sa;Password=sa123" />
      		<commandText value="INSERT INTO Log4Net ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
      		<parameter>
      			<parameterName value="@log_date" />
      			<dbType value="DateTime" />
      			<layout type="log4net.Layout.RawTimeStampLayout" />
      		</parameter>
      		<parameter>
      			<parameterName value="@thread" />
      			<dbType value="String" />
      			<size value="255" />
      			<layout type="log4net.Layout.PatternLayout">
      				<conversionPattern value="%thread" />
      			</layout>
      		</parameter>
      		<parameter>
      			<parameterName value="@log_level" />
      			<dbType value="String" />
      			<size value="50" />
      			<layout type="log4net.Layout.PatternLayout">
      				<conversionPattern value="%level" />
      			</layout>
      		</parameter>
      		<parameter>
      			<parameterName value="@logger" />
      			<dbType value="String" />
      			<size value="255" />
      			<layout type="log4net.Layout.PatternLayout">
      				<conversionPattern value="%logger" />
      			</layout>
      		</parameter>
      		<parameter>
      			<parameterName value="@message" />
      			<dbType value="String" />
      			<size value="4000" />
      			<layout type="log4net.Layout.PatternLayout">
      				<conversionPattern value="%message" />
      			</layout>
      		</parameter>
      		<parameter>
      			<parameterName value="@exception" />
      			<dbType value="String" />
      			<size value="2000" />
      			<layout type="log4net.Layout.ExceptionLayout" />
      		</parameter>
      	</appender>
      	
      	
      	<root>
      
      		<!--控制级别,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF-->
      		<!--OFF:0-->
      		<!--FATAL:FATAL-->
      		<!--ERROR: ERROR,FATAL-->
      		<!--WARN: WARN,ERROR,FATAL-->
      		<!--INFO: INFO,WARN,ERROR,FATAL-->
      		<!--DEBUG: INFO,WARN,ERROR,FATAL-->
      		<!--ALL: DEBUG,INFO,WARN,ERROR,FATAL--> 
      		<priority value="ALL"/>
      		
      		<level value="INFO"/>
      		<appender-ref ref="rollingAppender" />
      		<appender-ref ref="AdoNetAppender_SqlServer" />
      	</root>
      </log4net>
      
  • 右键属性,将文件设置为copy if newer 或者 copy always(在编译的时候复制到bin文件夹)

  • 在Program里导入

builder.Logging.AddLog4Net("同级目录/Log4Net.Config");
  • 调用日志接口

    • 构造函数注入
    private readonly ILogger<Controller> _ILogger; 
    public Controller(ILogger<Controller> ilogger){
        this._ILogger = ilogger;
    }
    
    • 日志记录
    _Ilogger.LogInformation("this is information");
    _ILogger.LogError("this is Error");
    _ILogger.LogWarning("this is Warning");
    _ILogger.DeBug("this is DeBug");
    

数据库日志

先安装SQLClient(相同的方法,System.Data开头的)

因为是SQL Server 没学过,暂时放着

IOC容器之第三方组件Autofac

  • 引入依赖Autofac和Autofac.Extensions.DependencyInjection都要
  • IOC的意义在于,操作的对象可以是抽象,而不是具体的实现
  • Autofac 是一个流行的依赖注入容器,它提供了许多高级功能,如自动装配、动态解析和生命周期管理。更多复杂的注入方式(属性注入、方法注入等)
  • .NET 原生的依赖注入是随着 .NET Core 的推出而引入的,它更加轻量级,易于使用,支持基本的依赖注入模式,包括构造函数注入、服务生命周期管理。
  • 单个类注入步骤
 // 创建构造器
 ContainerBuilder builder = new ContainerBuilder();

 // 注册抽象与实现的隐射
 builder.RegisterType<Print>().As<IPrint>();
 // 泛型
 builder.RegisterGeneric(typeof(List<>)).As(typeof(IList<>));

 // 构建容器
 IContainer container =  builder.Build();

 // 创建实例
 IPrint print = container.Resolve<IPrint>();
 IList<IPrint> prints = container.Resolve<IList<IPrint>>();

// 打印
 Console.WriteLine(print.ToString());
 foreach (var item in prints)
 {
     Console.WriteLine(item.ToString());
 }
 print.Print("This is Print");

// 此外还有多种注册方式(实例注册、注册逻辑)
  • 程序集注入
 //将其他程序集引入可以使用右键依赖项然后引用
// 创建构造器
ContainerBuilder builder = new ContainerBuilder();

// 假设我们有两个程序集,一个包含接口,另一个包含实现
Assembly interfaceAssembly = Assembly.LoadFrom("Interfaces.dll");//Interfaces是文件夹名称
Assembly implementationAssembly = Assembly.LoadFrom("Implementations.dll");

// 使用这个方法注册时,会扫描程序集所有的接口、实现
// 注册接口程序集中的所有接口类型
builder.RegisterAssemblyTypes(interfaceAssembly)
       .Where(t => t.IsInterface)
       .AsImplementedInterfaces();

// 注册实现程序集中的所有非接口类型(实现类)
builder.RegisterAssemblyTypes(implementationAssembly)
       .Where(t => !t.IsInterface)
       .AsImplementedInterfaces();

// 构建容器
var container = builder.Build();

// 尝试解析接口实例
var myService = container.Resolve<IMyService>();
// 其他写法
builder.RegisterAssemblyTypes(interfaceAssembly,implementationAssembly).AsImplementedInterfaces();
  • 正常注册之后,是只会完成构造器注入,如果有属性不在构造器就必须使用属性注入
 builder.RegisterType<Print>().As<IPrint>().PropertitiesAutowired;
  • 方法注入,创建实例之后,方法自动执行,参数自动注入(略)

  • 单抽象多实例,多个实现类注册,创建时默认生成最后注册的实现类

// 但也可以通过下面的方法来实现
builder.RegisterType<Print>().Keyed<IPrint>("NewPrint");
IPrint print = container.ResolveKeyed<IPrint>("NewPrint");

Autofac整合AOP

  • 引入包 Castle.Core
  • 编写相应的特性
public class CustomInterceptor : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        //方法执行前
        invocation.Proceed();
        //方法执行后
    }
}
  • 放在对应的类上并且对应的方法要定义为虚拟
[Intercept(typeof(CustomInterceptor))]

public virtual void Print()
{
    Console.WriteLine("方法执行")
}
  • 注册
builder.RegisterType<Print>().As<IPrint>().EnableClassInterceptors();

整合Autofac

// Program.cs里
 builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
 builder.Host.ConfigureContainer<ContainerBuilder>(Container =>
 {
     //注册服务
 });

// 整合程序集注册、单抽象多实例和AOP编程

using Autofac;
using Autofac.Extras.DynamicProxy;
using Castle.DynamicProxy;
using System;
using System.Reflection;

// 定义接口
public interface IPrint
{
    void PrintMessage(string message);
}

// 实现类
public class PrintA : IPrint
{
    public void PrintMessage(string message)
    {
        Console.WriteLine($"PrintA: {message}");
    }
}

public class PrintB : IPrint
{
    public void PrintMessage(string message)
    {
        Console.WriteLine($"PrintB: {message}");
    }
}

// AOP 拦截器
public class CallLogger : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        Console.WriteLine($"Before: {invocation.Method.Name}");
        invocation.Proceed();
        Console.WriteLine($"After: {invocation.Method.Name}");
    }
}

class Program
{
    static void Main(string[] args)
    {
        var builder = new ContainerBuilder();

        // 程序集注入
        var assembly = Assembly.GetExecutingAssembly();
        builder.RegisterAssemblyTypes(assembly)
            .Where(t => t.Name.EndsWith("A")) // 假设以"A"结尾的类是我们要注册的
            .AsImplementedInterfaces()
            .EnableClassInterceptors();

        // 单抽象多实例注册
        builder.RegisterType<PrintA>().Keyed<IPrint>("PrintA");
        builder.RegisterType<PrintB>().Keyed<IPrint>("PrintB");

        // 注册拦截器
        builder.Register(c => new CallLogger());

        var container = builder.Build();

        // 解析并使用服务
        var printA = container.ResolveKeyed<IPrint>("PrintA");
        var printB = container.ResolveKeyed<IPrint>("PrintB");

        printA.PrintMessage("Hello from PrintA");
        printB.PrintMessage("Hello from PrintB");
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2205420.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

希亦超声波清洗机是智商税吗?百元级超声波清洗机旗舰机皇真相大揭秘!

在深入探讨这个问题之前&#xff0c;我们先来了解一下超声波清洗机的工作原理。超声波清洗机利用高频振动波&#xff0c;通过液体介质传递能量&#xff0c;产生无数微小的气泡。这些气泡在压力作用下迅速闭合&#xff0c;形成强大的冲击波&#xff0c;能够深入清洁物品表面难以…

苹果秋季盛典:iPhone 16系列引领未来科技潮流

9月10日&#xff0c;苹果公司在众人瞩目中举办了2024年的秋季特别活动&#xff0c;发布了备受期待的iPhone 16系列。 尽管网络发布会已经持续了一整年&#xff0c;但熬夜观看的果粉们仍然热情不减&#xff0c;因为每一次苹果的新品发布都代表着科技界的一次重大飞跃。 iPhone …

汽车销量预测系统

项目介绍 此项目服务于汽车经销商、汽车生产商&#xff0c;旨在成为用于使企业充分了解消费者诉求&#xff0c;预见市场未来的需求量和可能存在的销售变化趋势&#xff0c;合理规划产能&#xff0c;正确制定生产计划&#xff0c;实施以销定产的生产策略的交流平台&#xff0c;…

应对专利过期的有效方法与补救措施

专利作为创新成果的重要保护手段&#xff0c;在一定期限内为所有者提供了独家的权利。然而&#xff0c;当专利过期时&#xff0c;情况会变得较为复杂&#xff0c;需要采取不同的应对方法&#xff0c;以下将分别针对忘记缴纳年费以及保护期限届满这两种常见情况进行要点解析。 一…

100V调光芯片SL8701 支持PWM/模拟调光 无频闪 多路共阳 高辉度65536级

一、产品概述 SL8701是一款内置100V MOS的降压型高调光比LED恒流驱动芯片&#xff0c;专为智能调光调色照明研发设计。它支持多种调光方式&#xff0c;包括PWM调光、模拟调光等&#xff0c;能够实现高调光比&#xff0c;满足不同场景的照明需求。 二、主要特点 高效降压&…

银行流水获取方式(二)

银行流水获取方式 摘要&#xff1a; 本文探讨了银行流水在企业财务管理中的重要性及其获取方式。银行流水是企业财务活动的关键记录&#xff0c;涵盖了所有资金流动情况&#xff0c;对日常运营、财务管理、税务申报和审计至关重要。企业通过核对银行流水确保账务准确性&#…

软测实验:熟悉功能测试工具

实验背景&#xff1a;理解自动化测试原理和方法&#xff0c;熟悉功能测试工具的使用。 实验目的&#xff1a; 熟悉功能测试工具的基本使用方法熟悉功能测试的基本流程能够根据测试结果撰写测试报告 一、测试需求 自动化测试原理是通过使用自动化测试工具和脚本来模拟人工测…

python 共享内存(注册、写入、读取)

import sys from PyQt5.QtWidgets import * from PyQt5.QtCore import * from UI.ui_shareMmap import Ui_ShareMServiceDlg # 导入UI类 import mmapclass QMainDialog(QDialog, Ui_ShareMServiceDlg): # 修改点&#xff08;UI类&#xff09;def __init__(self, parentNone):…

数据库文档编写流程

在一个系统中新增一个模块&#xff0c;通常不是一个人能够独立完成的。这需要多个团队甚至两个组的共同合作。例如&#xff0c;如果我们想在设备管理系统中添加一个IT资产管理模块&#xff0c;领导不会简单地说&#xff1a;“喂&#xff0c;你给我加一个IT资产管理模块。”直接…

如何做独立站将产品卖到国外?从零开始打造你的全球电商帝国

近年来&#xff0c;跨境电商发展迅猛&#xff0c;为卖家提供了广阔的市场空间。相比于传统跨境电商平台模式&#xff0c;独立站模式拥有更大的自主权和灵活性&#xff0c;卖家可以打造专属的品牌形象&#xff0c;并根据自身需求定制营销策略。 如果你也想通过独立站将产品卖到…

在培训考试小程序页面弹出半屏的弹窗交互实践

如果在页面内进行复杂的界面设计&#xff08;如在页面内弹出半屏的弹窗、在页面内加载一个全屏的子页面等&#xff09;&#xff0c;用户进行返回操作会直接离开当前页面&#xff0c;不符合用户预期&#xff0c;预期应为关闭当前弹出的组件。 为此提供“假页”容器组件page-con…

python爬虫 - 深入正则表达式

&#x1f308;个人主页&#xff1a;https://blog.csdn.net/2401_86688088?typeblog &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html 目录 前言 一、匹配多个字符 &#xff08;一&#xff09;匹配任意多个字符 &#xff0…

Java学习-JVM

目录 1. 基本常识 1.1 JVM是什么 1.2 JVM架构图 1.3 Java技术体系 1.4 Java与JVM的关系 2. 类加载系统 2.1 类加载器种类 2.2 执行顺序 2.3 类加载四个时机 2.4 生命周期 2.5 类加载途径 2.6 双亲委派模型 3. 运行时数据区 3.1 运行时数据区构成 3.2 堆 3.3 栈…

adaptor lora基础

https://www.zhihu.com/question/508658141/answer/3340979311 adaptor和PEFT的区别&#xff1a;前者在模型子层后加一个小型的dense&#xff1b;后者直接稀疏化模型本身&#xff1b; Loading Pre-Trained Adapters — AdapterHub documentation CVPR 2024 | SD-DiT&#xff…

五分钟带你零基础入门跨境电商独立站,干货速递!

对于跨境电商卖家来说&#xff0c;多平台、多站点的布局是非常重要的战略。这样做可以规避”鸡蛋放在同一个篮子里”的风险也能够追求更高的销售额和利润。同时&#xff0c;市场的变化也带来了新的发展机会&#xff0c;因此很多出海企业都希望抓住独立站的新机遇&#xff0c;抢…

什么因素能冲击实时现货黄金价格?

实时现货黄金价格怎样走&#xff0c;投资者关键要看全球通胀、经济增长、美联储货币政策和全球央行需求这些基本面的因素。在全球货币体系“去美元化”趋势越来越明晰的当下&#xff0c;黄金在国际储备中的地位将逐步上升——在尚未出现可取代美元的货币之前&#xff0c;黄金独…

电机是怎么转起来的?

世界上功率消耗量的近一半是由电机消耗&#xff0c;因此在解决世界能源问题上&#xff0c;电机的高效率化被称为是最有效的措施。 电机种类 一般情况下指将磁场内电流流通产生的力转变为旋转动作&#xff0c;在广义范围内还包括直线动作。 按电机驱动的电源种类&#xff0c;…

QD1-P17 HTML常用标签:下拉框

本节学习 HTML 常用标签&#xff1a;select和option ‍ 本节视频 www.bilibili.com/video/BV1n64y1U7oj?p17 ‍ 知识点1&#xff1a;select标签用法 演示 ​​ HTML <select name"city"><option>北京</option><option>上海</opti…

【计网】从零开始学习http协议 ---深入理解cookie和session

我的天空里没有太阳&#xff0c; 总是黑夜&#xff0c; 但并不暗&#xff0c; 因为有东西代替了太阳。 --- 东野圭吾 --- 从零开始学习http协议 1 理解cookie1.1 什么是cookie1.2 验证cookie1.3 cookie的属性 2 理解session2.1 什么是session2.2 验证session 1 理解cooki…

考研笔试/上机经典编程题集合(持续更新并完善解题思路)

目录 一、程序设计经典编程题(C语言实现)1.1 判断一个字符串是否由另一个字符串旋转得到1.2 字符串左旋1.3 求最大公约数以及最小公倍数1.4 二、力扣2.1 面试题 17.04. 消失的数字 三、牛客网3.1 OR62 倒置字符串3.2 BC84 计算y的值 一、程序设计经典编程题(C语言实现) 1.1 判…