当前位置: 首页 > news >正文

网站建设加网络营销上传的网站打不开怎么办

网站建设加网络营销,上传的网站打不开怎么办,做铁合金用哪个外贸网站好,跨境电商app文章目录 项目地址一、Infrastructure Layer1.1 创建Application层需要的服务1. Clock服务2. Email 服务3. 注册服务 1.2 数据库服务1. 表配置Configurations2. Respository实现3. 数据库链接Factory实现4. Dapper的DataOnly服务实现5. 所有数据库服务注册 1.3 基于RowVersion的…

文章目录

  • 项目地址
  • 一、Infrastructure Layer
    • 1.1 创建Application层需要的服务
      • 1. Clock服务
      • 2. Email 服务
      • 3. 注册服务
    • 1.2 数据库服务
      • 1. 表配置Configurations
      • 2. Respository实现
      • 3. 数据库链接Factory实现
      • 4. Dapper的DataOnly服务实现
      • 5. 所有数据库服务注册
    • 1.3 基于RowVersion的乐观锁
      • 1. 添加RowVersion字段
      • 2. 修改ReserveBookingCommandHandler


项目地址

  • 教程作者:
  • 教程地址:
  • 代码仓库地址:
  • 所用到的框架和插件:
dbt 
airflow

一、Infrastructure Layer

在这里插入图片描述

添加对Application层和Domain层的引用
在这里插入图片描述

1.1 创建Application层需要的服务

1. Clock服务

  • 当前时间接口的实现
using Bookify.Application.Abstractions.Clock;
namespace Bookify.Infrastructure.Clock;
internal sealed class DateTimeProvider : IDateTimeProvider
{public DateTime UtcNow => DateTime.UtcNow;
}

2. Email 服务

  • Email的服务,实现Appliaction的接口
using Bookify.Application.Abstractions.Email;
namespace Bookify.Infrastructure.Email;
internal sealed class EmailService : IEmailService
{public Task SendAsync(Domain.Users.Email recipient, string subject, string body){return Task.CompletedTask;}
}

3. 注册服务

  • 注册上面的两个服务
public static class DependencyInjection
{public static IServiceCollection AddInfrastructure(this IServiceCollection services,IConfiguration configuration){services.AddTransient<IDateTimeProvider, DateTimeProvider>();services.AddTransient<IEmailService, EmailService>();return services;}
}

1.2 数据库服务

1. 表配置Configurations

  1. BookingConfiguration.cs
internal sealed class BookingConfiguration : IEntityTypeConfiguration<Booking>
{public void Configure(EntityTypeBuilder<Booking> builder){//设置数据库表名为 bookingsbuilder.ToTable("bookings");//设置主键为 Idbuilder.HasKey(booking => booking.Id);//OwnsOne处理值对象builder.OwnsOne(booking => booking.PriceForPeriod, priceBuilder =>{priceBuilder.Property(money => money.Currency).HasConversion(currency => currency.Code, code => Currency.FromCode(code));});builder.OwnsOne(booking => booking.CleaningFee, priceBuilder =>{priceBuilder.Property(money => money.Currency).HasConversion(currency => currency.Code, code => Currency.FromCode(code));});builder.OwnsOne(booking => booking.AmenitiesUpCharge, priceBuilder =>{priceBuilder.Property(money => money.Currency).HasConversion(currency => currency.Code, code => Currency.FromCode(code));});builder.OwnsOne(booking => booking.TotalPrice, priceBuilder =>{priceBuilder.Property(money => money.Currency).HasConversion(currency => currency.Code, code => Currency.FromCode(code));});builder.OwnsOne(booking => booking.Duration);builder.HasOne<Apartment>().WithMany().HasForeignKey(booking => booking.ApartmentId);builder.HasOne<User>().WithMany().HasForeignKey(booking => booking.UserId);}
}
  1. ApartmentConfiguration.cs
internal sealed class ApartmentConfiguration : IEntityTypeConfiguration<Apartment>
{public void Configure(EntityTypeBuilder<Apartment> builder){builder.ToTable("apartments");builder.HasKey(apartment => apartment.Id);builder.OwnsOne(apartment => apartment.Address);builder.Property(apartment => apartment.Name).HasMaxLength(200).HasConversion(name => name.Value, value => new Name(value));builder.Property(apartment => apartment.Description).HasMaxLength(2000).HasConversion(description => description.Value, value => new Description(value));builder.OwnsOne(apartment => apartment.Price, priceBuilder =>{priceBuilder.Property(money => money.Currency).HasConversion(currency => currency.Code, code => Currency.FromCode(code));});builder.OwnsOne(apartment => apartment.CleaningFee, priceBuilder =>{priceBuilder.Property(money => money.Currency).HasConversion(currency => currency.Code, code => Currency.FromCode(code));});builder.Property<uint>("Version").IsRowVersion();}
}

2. Respository实现

  1. Repository.cs
internal abstract class Repository<T>where T : Entity
{protected readonly ApplicationDbContext DbContext;protected Repository(ApplicationDbContext dbContext){DbContext = dbContext;}public async Task<T?> GetByIdAsync(Guid id,CancellationToken cancellationToken = default){return await DbContext.Set<T>().FirstOrDefaultAsync(user => user.Id == id, cancellationToken);}public void Add(T entity){DbContext.Add(entity);}
}
  1. BookingRepository.cs
namespace Bookify.Infrastructure.Repositories;internal sealed class BookingRepository : Repository<Booking>, IBookingRepository
{private static readonly BookingStatus[] ActiveBookingStatuses ={BookingStatus.Reserved,BookingStatus.Confirmed,BookingStatus.Completed};public BookingRepository(ApplicationDbContext dbContext): base(dbContext){}public async Task<bool> IsOverlappingAsync(Apartment apartment,DateRange duration,CancellationToken cancellationToken = default){return await DbContext.Set<Booking>().AnyAsync(booking =>booking.ApartmentId == apartment.Id &&booking.Duration.Start <= duration.End &&booking.Duration.End >= duration.Start &&ActiveBookingStatuses.Contains(booking.Status),cancellationToken);}
}

3. 数据库链接Factory实现

//创建Dapper链接数据库的工厂
internal sealed class SqlConnectionFactory : ISqlConnectionFactory
{private readonly string _connectionString;public SqlConnectionFactory(string connectionString){_connectionString = connectionString;}public IDbConnection CreateConnection(){var connection = new NpgsqlConnection(_connectionString);connection.Open();return connection;}
}

4. Dapper的DataOnly服务实现

namespace Bookify.Infrastructure.Data;
/// <summary>
/// A Dapper type handler for <see cref="DateOnly"/>.
/// </summary>
internal sealed class DateOnlyTypeHandler : SqlMapper.TypeHandler<DateOnly>
{public override DateOnly Parse(object value) => DateOnly.FromDateTime((DateTime)value);public override void SetValue(IDbDataParameter parameter, DateOnly value){parameter.DbType = DbType.Date;parameter.Value = value;}
}

5. 所有数据库服务注册

  • 注册所有infrastructure的服务

public static class DependencyInjection
{public static IServiceCollection AddInfrastructure(this IServiceCollection services,IConfiguration configuration){services.AddTransient<IDateTimeProvider, DateTimeProvider>();services.AddTransient<IEmailService, EmailService>();string connectionString =configuration.GetConnectionString("Database") ??throw new ArgumentNullException(nameof(configuration));services.AddDbContext<ApplicationDbContext>(options =>{options.UseNpgsql(connectionString).UseSnakeCaseNamingConvention();});services.AddScoped<IUserRepository, UserRepository>();services.AddScoped<IApartmentRepository, ApartmentRepository>();services.AddScoped<IBookingRepository, BookingRepository>();services.AddScoped<IUnitOfWork>(sp => sp.GetRequiredService<ApplicationDbContext>());services.AddSingleton<ISqlConnectionFactory>(_ =>new SqlConnectionFactory(connectionString));SqlMapper.AddTypeHandler(new DateOnlyTypeHandler());return services;}
}

1.3 基于RowVersion的乐观锁

1. 添加RowVersion字段

  • 这里我们预定apartment需要乐观锁,所以在他的数据库configuration里添加

在这里插入图片描述

2. 修改ReserveBookingCommandHandler

  • 发成冲突后,返回已经预定的错误
    在这里插入图片描述
http://www.dtcms.com/a/411317.html

相关文章:

  • 南京网站建设公司哪家好seo专业课程
  • 网线制作工具seo报告
  • Python写入PostgreSQL表的三种实现方法
  • 聊聊UI自动化测试有哪些优势
  • 想自己做网站推广淘宝做动效代码的网站
  • 做一个能注册用户的网站空间设计师工资一般多少
  • 【精品资料鉴赏】解读145页 PPT汽车集团数字化转型互联网+顶层战略设计方案
  • 环签名:AOS Borromean
  • 自适应平台(Adaptive Platform)标准——Specification of Time Synchronization
  • 制作网站的知识网站访客qq获取系统 报价
  • tcpdump 使用详解
  • 新余 网站建设公司上海黄浦网站建设
  • 数据采集技术:02 有关离线采集
  • 【SCI一区】模糊斜率熵 Fuzzy Slope Entropy+状态分类、故障诊断!
  • 品牌网站解决方案vr全景网站怎么做
  • 科技有限公司 网站制作poedit2 汉化wordpress
  • 视频融合平台EasyCVR 构筑智慧交通可视化管理与智能决策中枢
  • 一个商城网站开发要多少时间内蒙中国建设银行招聘网站
  • 从图像到精准文字:基于PyTorch与CTC的端到端手写文本识别实战
  • 使用 PyTorch 实现 CIFAR-10 图像分类:从数据加载到模型训练全流程
  • 网站开发公司能否挣钱怎么在网站空间上传文件
  • 亭湖区建设局网站楼盘网站开发报价
  • java后端工程师进修ing(研一版‖day49)
  • opendds初入门之对inforepo模式运行探索
  • 简单公司网站最全的域名后缀
  • 比邻智联发布生活物联网家电应用白皮书和Cat.1模组新品
  • 第七章 Spring-Boot框架
  • 网站html静态化解决方案网站制作公司 北京
  • 金仓数据库实现电子证照系统从MongoDB平滑迁移,国产化替代迎来新典范
  • CAN总线学习(四)错误处理 STM32CAN外设一