.Net基础1

.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.mzph.cn/news/881514.shtml

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

相关文章

数字化AI新赋能,智享AI直播:开启一个全新的直播时代!

数字化AI新赋能&#xff0c;智享AI直播&#xff1a;开启一个全新的直播时代! 在科技日新月异的今天&#xff0c;人工智能&#xff08;AI&#xff09;技术正以前所未有的速度改变着我们的生活和工作方式。其中&#xff0c;AI直播技术的崛起&#xff0c;无疑是数字化时代的一大亮…

深入理解 C/C++ 指针

深入理解 C 指针&#xff1a;指针、解引用与指针变量的详细解析 前言 在 C 编程语言中&#xff0c;指针 是一个非常强大且重要的概念。对于初学者来说&#xff0c;指针往往会让人感到困惑不解。本文将通过形象的比喻&#xff0c;帮助大家深入理解指针、解引用与指针变量的概念…

ELK:Elasticsearch、Logstash、Kibana Spring Cloud Sleuth和Spring Cloud Zipkin

〇、虚拟机中docker安装elasticsearch 、Kibana、Logstash elasticsearch导入中文分词器 Logstash修改es数据库ip及创建索引名配置 一、elasticsearch数据库的结构 和mysql作比较&#xff0c;mysql中的数据库的二维表相当于es数据库的index索引结构&#xff1b;mysql数据库的二…

大数据处理从零开始————4.认识HDFS分布式文件系统

1.分布式文件系统HDFS 1.1 认识HDFS 当单台服务器的存储容量和计算性能已经无法处理大文件时&#xff0c;分布式文件系统应运而生。什么是分布式系统&#xff0c;分布式系统是由多个独立的计算机或节点组成的系统&#xff0c;这些计算机通过网络连接&#xff…

Mysql(五) --- 数据库设计

文章目录 前言1.范式1.1.第一范式1.1.1 定义1.1.2.例子 1.2.第二范式1.2.1 定义1.2.2 例子1.2.3.不满足第二范式可能会出现的问题 1.3.第三范式1.3.1 定义2.3.2 示例 2. 设计过程3. 实体-关系图3.1 E-R图的基本组成3.2 关系的类型3.2.1 一对一关系(1:1)3.2.2 ⼀对多关系(1:N)3.…

paimon,基础查询语句测试

基础设置 -- 创建catalog/加载catalog&#xff0c;如果这个catalog已经存在就不会创建&#xff0c;自动加载元数据信息CREATE CATALOG fs_paimon_catalog WITH ( type paimon, warehouse hdfs://wsl01:8020/paimon/catalog ); -- 使用catalog use catalog fs_paimon_catalog…

Java虚拟机(JVM)

目录 内存区域划分堆&#xff08;Heap&#xff09;方法区&#xff08;Method Area&#xff09;程序计数器&#xff08;Program Counter Register&#xff09;虚拟机栈&#xff08;VM Stack&#xff09;本地方法栈&#xff08;Native Method Stack&#xff09; 类加载的过程类加…

[C++]使用纯opencv部署yolov11-seg实例分割onnx模型

【算法介绍】 在C中使用纯OpenCV部署YOLOv11-seg进行实例分割是一项具有挑战性的任务&#xff0c;因为YOLOv11通常是用PyTorch等深度学习框架实现的&#xff0c;而OpenCV本身并不直接支持加载和运行PyTorch模型。然而&#xff0c;可以通过一些间接的方法来实现这一目标&#x…

运维工具之ansible

Ansible 1.什么是ansible? ​ ansible是基于ssh架构的自动化运维工具&#xff0c;由python语言实现&#xff0c;通过ansible可以远程批量部署等。 2.部署前提 ​ 控制端需要安装ansible,被控制端要开启ssh服务&#xff0c;并允许远程登录&#xff0c;被管理主机需要安装py…

卸载PLSQL及标准卸载流程

目录 1. 卸载PLSQL2. 删除注册表3. 删除数据信息 1. 卸载PLSQL 等待进度条走完 2. 删除注册表 regedit 右击删除 3. 删除数据信息 由于AppData是隐藏文件&#xff0c;需要勾选隐藏的项目。 重启电脑&#xff0c;PLSQL就卸载成功了。

浏览器和客户端结合的erp系统,java控制浏览器操作自动登录,socket客户端通信进行表单赋值

java做一个toB的客户端操作系统&#xff0c;客户端和web的结合&#xff1b; 主要是使用java编写客户端代码&#xff0c;采用selenium控制浏览器&#xff0c;主要是用到selenium自动化测试的功能&#xff1b; javaEE 项目调用 selenium使用谷歌控件chromedriver.exe控制浏览器…

使用Java调用OpenAI API并解析响应:详细教程

使用Java调用OpenAI API并解析响应&#xff1a;详细教程 在现代应用程序中&#xff0c;API调用是一个非常常见的任务。本文将通过一个完整的示例&#xff0c;讲解如何使用Java调用OpenAI的ChatGPT API&#xff0c;并通过ObjectMapper处理JSON响应。本文的示例不仅适用于OpenAI…

网络参考模型

OSI七层网络参考模型 OSI模型仅作为参考&#xff0c;现实中并不用&#xff0c;OSI模型的目的是为了解决主机之间的网络通讯。 1. 物理层&#xff1a; 物理层将由比特&#xff08;0和1&#xff09;组成的数据用不同的媒介&#xff08;电、光或其他形式的电磁波&#xff09;传输…

黑马软件测试第一篇_测试理论

概念 使用技术手段验证软件功能是否符合需求 测试种类 功能测试 自动化测试 接口测试 性能测试 按测试阶段划分 单元测试&#xff1a;针对程序源码进行测试 集成测试&#xff1a;又称接口测试&#xff0c;针对模块之间访问地址进行测试 系统测试&#xff1a;对整个系统进行…

京东零售数据湖应用与实践

作者&#xff1a;陈洪健&#xff1a;京东零售大数据架构师&#xff0c;深耕大数据 10 年&#xff0c;2019 年加入京东&#xff0c;主要负责 OLAP 优化、大数据传输工具生态、流批一体、SRE 建设。 当前企业数据处理广泛采用 Lambda 架构。Lambda 架构的优点是保证了数据的完整性…

YOLO的相关改进机制

我的面包多平台有多种关于YOLO的改进&#xff0c;大家尽早关注&#xff0c;不迷路

【宽字节注入】

字符编码 url 编码 GBK编码 utf8 编码 宽字节注入 php中的转译函数 宽字节注入介绍 练习 正常输入没有回显&#xff1a; 没有回显 usernameadmin&passwordadmin 闭合单引号&#xff0c;依旧没有回显 usernameadmin and 11%23&passwordadmin利用宽字节尝试闭合,依旧…

查看SQL Server授权序列号通过SQL查询查看安装日志文件使用PowerShell查询

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…

在Stable Diffusion WebUI中安装SadTalker插件时几种错误提示的处理方法

SD中的插件一般安装比较简单&#xff0c;但也有一些插件安装会比较难。比如我在安装SadTalker时&#xff0c;就遇到很多问题&#xff0c;一度放弃了&#xff0c;后来查了一些网上攻略&#xff0c;自己也反复查看日志&#xff0c;终于解决&#xff0c;不吐不快。 一、在Stable …

闪迪U盘误删的数据该怎么恢复呢?3个方法轻松解决

闪迪是一家全球知名的美国公司&#xff0c;也是全球最大的闪存数据存储卡产品供应商&#xff0c;其中&#xff0c;闪迪U盘作为其主要产品之一&#xff0c;因其便携性、大容量和高速传输能力而深受用户喜爱。然而&#xff0c;在平时存储重要数据的时候&#xff0c;会因为我们一系…