net6.0 配置autofac6.3.0配置EFCore

环境:

VS2022
SqlServer 2019
Autofac 6.3.0
EFCore 6.0.3
dotnet 6.0

创建项目

创建了项目的时候才发现有些坑,比如没有Startup.cs,环境有些不一样
image

AutoFac是什么?

autofac是一种IOC容器,它能帮你控制类的创建,让你不再创建实例也能使用类的函数和变量,它也能提供依赖注入,只需要注入已经控制的类,便可以使用类的方法和变量。

安装Autofac

打开项目在nuget包管理器里面搜索autofac安装
image
image

配置AutoFac

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();

//一定要写这句,替换 .NET的默认容器
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());

//配置服务
ConfigureServices(builder.Services);

//将当前项目的封装名作为扫描的条件,autofac自动扫描注册
builder.Host.ConfigureContainer<ContainerBuilder>(builder =>
{
    Assembly[] assemblies = new Assembly[] { Assembly.Load("net6webapp") };
    builder.RegisterAssemblyTypes(assemblies);
});

至此autofac配置就差不多可以用了,有一些更详细的配置推荐 戳我去看官方文档

EFCore安装

从nuget安装
EntityFrameWorkCore
EntityFrameWorkCore.SqlServer
EntityFrameWorkCore.Tools

image

EFCore 配置

创建AppDbContext

public class AppDbContext : DbContext
{
    //因为使用了service注入,所以在创建类的时候需要一个带参数的构造函数
    public AppDbContext(DbContextOptions<AppDbContext> options)
        : base(options)
    { }

    public DbSet<Temperature> Temperatures { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        //modelBuilder.Entity<Person>().HasIndex(u => u.Name).IsUnique(); //是否唯一,看你直接是否需要咯
    }
}

配置Program.cs,一些 global using 真的蛋疼

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();

//一定要写这句,替换 .NET的默认容器
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());

//配置服务
ConfigureServices(builder.Services);

//将当前项目的封装名作为扫描的条件,autofac自动扫描注册
builder.Host.ConfigureContainer<ContainerBuilder>(builder =>
{
    Assembly[] assemblies = new Assembly[] { Assembly.Load("net6webapp") };
    builder.RegisterAssemblyTypes(assemblies);
});

var app = builder.Build();

...

app.Run();


void ConfigureServices(IServiceCollection services){
    //使用service的方式注入EF
    services.AddDbContext<AppDbContext>(options => {
        options.UseSqlServer(builder.Configuration.GetConnectionString("default"));
    });
}

appsetting.json中配置链接字符串

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "urls": "http://*:80",
  "ConnectionStrings": {
    "default": "server=192.168.1.41;database=DbDefault;uid=sa;pwd=123456;"
  }
}

然后就愉快的使用吧!创建helloworldController

public class HelloWorldController : Controller
{

    private readonly TemperatureService _temperatureService;

    public HelloWorldController(TemperatureService temperatureService)
    {
        _temperatureService = temperatureService;
    }

    public string Index()
    {
        return "This is my default action..."+ _temperatureService.GetTemp();
    }
}

TemperatureService.cs

public class TemperatureService
{

    private readonly AppDbContext _appDbContext;

    public TemperatureService(AppDbContext appDbContext)
    {
        _appDbContext = appDbContext;
    }

    public string GetTemp()
    {
        return "{humidity: \"0.0 % \",temp: \"0.0'C\"}";
    }

    public async Task Insert(string temperature,string humidity)
    {
        _appDbContext.Temperatures.Add(new Domain.Temperature()
        {
            Time = DateTime.Now,
            Temp = temperature,
            Humidity = humidity
        });
        await _appDbContext.SaveChangesAsync();
     }
}

结束语:

相信一些朋友已经发现了吧,我这是准备跑在微型电脑上的程序,用来获取温度并保存数据库的。已经实现了,所以会有一些心得体会所以给大家分享一下。
net6.0在设备上跑起来还是蛮快的,比springboot要快一点点而已;可以在本地发布后再部署到linux上,不然linux上发布太慢了。

posted @ 2022-04-10 21:46  昨天的小冉  阅读(736)  评论(0编辑  收藏  举报