.NET开发基础知识1-10

1. 依赖注入(Dependency Injection)

  • 技术知识:依赖注入是一种设计模式,它允许将对象的依赖关系从对象本身中分离出来,通过构造函数、属性或方法参数等方式注入到对象中。这样可以提高代码的可测试性、可维护性和可扩展性。

  • 案例 :在一个简单的后台管理系统中,有一个用户服务接口 IUserService 和其实现类 UserService。通过依赖注入,我们可以将 UserService 注入到控制器中。

    dotnet-core-dependency-injection.NET Core 依赖注入示例

    生成 Program.cs

    using Microsoft.AspNetCore.Builder;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Hosting;

    // 定义用户服务接口
    public interface IUserService
    {
    string GetUserName();
    }

    // 实现用户服务接口
    public class UserService : IUserService
    {
    public string GetUserName()
    {
    return "John Doe";
    }
    }

    // 定义用户控制器
    public class UserController
    {
    private readonly IUserService _userService;

    复制代码
      public UserController(IUserService userService)
      {
          _userService = userService;
      }
    
      public string GetUser()
      {
          return _userService.GetUserName();
      }

    }

    var builder = WebApplication.CreateBuilder(args);

    // 注册服务
    builder.Services.AddScoped<IUserService, UserService>();

    var app = builder.Build();

    app.Run(async context =>
    {
    var serviceProvider = app.Services;
    var userController = serviceProvider.GetRequiredService<UserController>();
    var userName = userController.GetUser();
    await context.Response.WriteAsync($"User Name: {userName}");
    });

    app.Run();

2. 中间件(Middleware)

  • 技术知识:中间件是处理 HTTP 请求和响应的组件,它们按顺序依次执行,可以对请求进行预处理,也可以对响应进行后处理。

  • 案例:创建一个简单的日志中间件,记录每个请求的信息。

    using Microsoft.AspNetCore.Builder;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.Extensions.Hosting;
    using System;
    using System.Threading.Tasks;

    // 定义日志中间件
    public class LoggingMiddleware
    {
    private readonly RequestDelegate _next;

    复制代码
      public LoggingMiddleware(RequestDelegate next)
      {
          _next = next;
      }
    
      public async Task InvokeAsync(Microsoft.AspNetCore.Http.HttpContext context)
      {
          Console.WriteLine($"Request received at {DateTime.Now}: {context.Request.Path}");
          await _next(context);
          Console.WriteLine($"Response sent at {DateTime.Now}");
      }

    }

    var builder = WebApplication.CreateBuilder(args);
    var app = builder.Build();

    // 使用日志中间件
    app.UseMiddleware<LoggingMiddleware>();

    app.Run(async context =>
    {
    await context.Response.WriteAsync("Hello, World!");
    });

    app.Run();

3. 路由(Routing)

  • 技术知识:路由是将 HTTP 请求映射到相应的处理程序(如控制器的动作方法)的过程。

  • 案例:创建一个简单的控制器,并使用路由来处理不同的请求。

    using Microsoft.AspNetCore.Builder;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Hosting;

    // 定义控制器
    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
    [HttpGet]
    public IActionResult Get()
    {
    return Ok("This is a weather forecast.");
    }
    }

    var builder = WebApplication.CreateBuilder(args);
    builder.Services.AddControllers();

    var app = builder.Build();

    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
    endpoints.MapControllers();
    });

    app.Run();

4. 实体框架核心(Entity Framework Core)

  • 技术知识:Entity Framework Core 是一个跨平台的对象关系映射(ORM)框架,它允许开发人员使用面向对象的方式操作数据库。

  • 案例:创建一个简单的数据库上下文和实体类,并进行数据的增删改查操作。

    using Microsoft.EntityFrameworkCore;
    using System;
    using System.Collections.Generic;
    using System.Linq;

    // 定义实体类
    public class Blog
    {
    public int BlogId { get; set; }
    public string Url { get; set; }
    public List<Post> Posts { get; } = new List<Post>();
    }

    public class Post
    {
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    复制代码
      public int BlogId { get; set; }
      public Blog Blog { get; set; }

    }

    // 定义数据库上下文
    public class BloggingContext : DbContext
    {
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }

    复制代码
      protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
      {
          optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;");
      }

    }

    class Program
    {
    static void Main()
    {
    using (var db = new BloggingContext())
    {
    // 添加博客
    db.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/adonet" });
    var count = db.SaveChanges();
    Console.WriteLine("{0} records saved to database", count);

    复制代码
              // 查询博客
              var blogs = db.Blogs
                  .OrderBy(b => b.Url)
                  .ToList();
    
              foreach (var blog in blogs)
              {
                  Console.WriteLine("Blog: {0}", blog.Url);
              }
          }
      }

    }

5. 认证和授权(Authentication and Authorization)

  • 技术知识:认证是验证用户身份的过程,授权是确定用户是否有权限访问特定资源的过程。

  • 案例:使用 JWT(JSON Web Token)进行认证和授权。

    using Microsoft.AspNetCore.Authentication.JwtBearer;
    using Microsoft.AspNetCore.Authorization;
    using Microsoft.AspNetCore.Builder;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Hosting;
    using Microsoft.IdentityModel.Tokens;
    using System.Text;

    var builder = WebApplication.CreateBuilder(args);

    // 添加 JWT 认证服务
    builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
    options.TokenValidationParameters = new TokenValidationParameters
    {
    ValidateIssuer = true,
    ValidateAudience = true,
    ValidateLifetime = true,
    ValidateIssuerSigningKey = true,
    ValidIssuer = "YourIssuer",
    ValidAudience = "YourAudience",
    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("YourSecretKey"))
    };
    });

    // 添加授权服务
    builder.Services.AddAuthorization(options =>
    {
    options.FallbackPolicy = new AuthorizationPolicyBuilder()
    .RequireAuthenticatedUser()
    .Build();
    });

    builder.Services.AddControllers();

    var app = builder.Build();

    app.UseAuthentication();
    app.UseAuthorization();

    app.MapControllers();

    app.Run();

6. 配置管理(Configuration Management)

  • 技术知识:配置管理允许将应用程序的配置信息(如数据库连接字符串、API 密钥等)与代码分离,方便在不同环境中进行配置。

  • 案例 :使用 appsettings.json 文件进行配置管理。

Program.cs

复制代码
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

var builder = WebApplication.CreateBuilder(args);

// 读取配置文件
var configuration = builder.Configuration;
var connectionString = configuration.GetConnectionString("DefaultConnection");

// 可以使用 connectionString 进行数据库连接等操作

var app = builder.Build();

app.Run(async context =>
{
    await context.Response.WriteAsync($"Connection String: {connectionString}");
});

app.Run();

appsettings.json

复制代码
{
    "ConnectionStrings": {
        "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=MyDatabase;Trusted_Connection=True;"
    },
    "Logging": {
        "LogLevel": {
            "Default": "Information",
            "Microsoft.AspNetCore": "Warning"
        }
    },
    "AllowedHosts": "*"
}

7. 日志记录(Logging)

  • 技术知识:日志记录是记录应用程序运行时信息的过程,有助于调试和监控应用程序。

  • 案例:使用内置的日志记录器记录信息。

    using Microsoft.AspNetCore.Builder;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Hosting;
    using Microsoft.Extensions.Logging;

    var builder = WebApplication.CreateBuilder(args);

    // 添加日志服务
    builder.Logging.AddConsole();

    var app = builder.Build();

    var logger = app.Services.GetRequiredService<ILogger<Program>>();
    logger.LogInformation("Application started.");

    app.Run(async context =>
    {
    logger.LogInformation("Request received.");
    await context.Response.WriteAsync("Hello, World!");
    logger.LogInformation("Response sent.");
    });

    app.Run();

8. 异步编程(Asynchronous Programming)

  • 技术知识:异步编程允许应用程序在执行耗时操作(如数据库查询、网络请求等)时不阻塞线程,提高应用程序的性能和响应能力。

  • 案例 :使用 asyncawait 关键字进行异步数据库查询。

    using Microsoft.AspNetCore.Builder;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Hosting;
    using Microsoft.Extensions.Logging;

    var builder = WebApplication.CreateBuilder(args);

    // 添加日志服务
    builder.Logging.AddConsole();

    var app = builder.Build();

    var logger = app.Services.GetRequiredService<ILogger<Program>>();
    logger.LogInformation("Application started.");

    app.Run(async context =>
    {
    logger.LogInformation("Request received.");
    await context.Response.WriteAsync("Hello, World!");
    logger.LogInformation("Response sent.");
    });

    app.Run();

9. 单元测试(Unit Testing)

  • 技术知识:单元测试是对应用程序中的最小可测试单元(如方法、类等)进行测试的过程,有助于确保代码的正确性和可维护性。

  • 案例 :使用 xUnit 框架对一个简单的服务进行单元测试。

    using Xunit;

    // 定义一个简单的服务
    public class CalculatorService
    {
    public int Add(int a, int b)
    {
    return a + b;
    }
    }

    public class CalculatorServiceTests
    {
    [Fact]
    public void Add_TwoNumbers_ReturnsSum()
    {
    // Arrange
    var calculator = new CalculatorService();
    int a = 2;
    int b = 3;

    复制代码
          // Act
          int result = calculator.Add(a, b);
    
          // Assert
          Assert.Equal(5, result);
      }

    }

10. Web API 开发

  • 技术知识:Web API 是一种允许不同应用程序之间进行通信的接口,通常使用 HTTP 协议进行数据传输。

  • 案例:创建一个简单的 Web API 控制器,提供数据查询和添加功能。

    using Microsoft.AspNetCore.Builder;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Hosting;
    using System.Collections.Generic;

    // 定义数据模型
    public class Product
    {
    public int Id { get; set; }
    public string Name { get; set; }
    }

    // 定义控制器
    [ApiController]
    [Route("api/[controller]")]
    public class ProductsController : ControllerBase
    {
    private static List<Product> _products = new List<Product>();

    复制代码
      [HttpGet]
      public IActionResult Get()
      {
          return Ok(_products);
      }
    
      [HttpPost]
      public IActionResult Post([FromBody] Product product)
      {
          _products.Add(product);
          return CreatedAtAction(nameof(Get), new { id = product.Id }, product);
      }

    }

    var builder = WebApplication.CreateBuilder(args);
    builder.Services.AddControllers();

    var app = builder.Build();

    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
    endpoints.MapControllers();
    });

    app.Run();

相关推荐
gc_22993 小时前
C#测试Excel开源组件ExcelDataReader
c#·excel·exceldatareader
勘察加熊人5 小时前
c#使用forms实现helloworld和login登录
开发语言·c#
我不是程序猿儿6 小时前
【C#】设备回帧太快、数据没收完整就被读取,导致帧被拆、混、丢,很常见,尤其在高频通信设备,解决方案
开发语言·c#
闪电麦坤957 小时前
C#:尝试解析方法TryParse
开发语言·c#
我不是程序猿儿7 小时前
【C#】构造协议帧通过串口下发
开发语言·c#
白烟染黑墨8 小时前
抽离BlazorWebview中的.Net与Javascript的互操作库
c#·客户端开发
小样vvv10 小时前
【分布式】深入剖析 Sentinel 限流:原理、实现
分布式·c#·sentinel
闪电麦坤9511 小时前
C#:常见 Console 类输入输出方法
开发语言·c#
勘察加熊人13 小时前
c#使用wpf实现helloworld和login登录
开发语言·c#·wpf
鲤籽鲲14 小时前
C# System.Net.Dns 使用详解
网络·c#·.net