OsharpNS框架入门教程
- OsharpNS所需的基础环境 ok
- 使用OsharpNS项目模板创建项目 ok
- 配置数据库连接串并启动项目 ok
- Angular6的前端项目启动
- 使用MySql作为数据库实例 ok
- 多上下文配置实例 ok
- OsharpNS.Swagger使用实例 ok
- OsharpNS.Hangfire使用实例
- OsharpNS.Redis启用实例
- OSharp.Permissions强制注入角色实例
OsharpNS官方资源
- 项目地址:https://github.com/i66soft/osharp-ns20
- 演示地址:https://www.osharp.org/
- 发布博客:https://www.cnblogs.com/guomingfeng/p/osharpns-publish.html
- VS插件:https://marketplace.visualstudio.com/items?itemName=LiuliuSoft.osharp
OsharpNS所需的基础环境
- OSharpNS始终紧随微软的步伐,使用最新版本的 dotnetcore,请前往[Download .NET (Linux, macOS, and Windows)](https://dotnet.microsoft.com/download,"Download .NET (Linux, macOS, and Windows")点击
Download .NET Core SDK
下载并安装最新版本的dotnetcore - 下载并安装.net core开发环境(本人使用VS2017/VS2019作为作为OsharpNS的开发环境,欢迎高手提供VS Code开发和调试.net core程序的方法,这环境太庞大)
- 下载并安装Angular6的前端开发环境(本人使用VS Code)
使用OsharpNS项目模板创建项目
- 在任意空白目录,打开
cmd
或者powershell
命令行窗口
- 执行命令
dotnet new -i OSharpNS.Template.Mvc_Angular
- 执行命令
dotnet new osharp_cmd
获取Osharp安装脚本,执行完成后,目录中出现cmd_build.bat
文件
- 双击
cmd_build.bat
,并根据要求命名项目名称(也可以根据喜好对项目进行命名,本示例使用CanDoo.Test作为项目名称),完成项目创建
配置数据库连接串并启动项目
- 打开解决方案
CanDoo.Test.sln
后,各个工程之间的引用关系已配置好,osharp框架的类库已引用 nuget.org 上的相应版本,并将自动还原好
- 在解决方案上,右击,点击
还原Nuget包
,完成相关引用的还原
- 在解决方案上,右击,点击
属性
,更改启动项目为CanDoo.Test.Web
- 打开
appsettings.Development.json
,对数据库连接串根据实际进行修改(appsettings.json
为正式发布时使用的配置文件,调试时使用的是appsettings.Development.json
,请注意区分)
- 运行项目
CanDoo.Test.Web
,如果能看到Swagger
说明运行成功(首次启动系统自动创建数据库,初始化相关参数,时间较久)
补充说明:OsharpNS正在大力完善中,更新比较快,如果需要更新OsharpNS的引用,请点击在解决方案上,右击,点击管理解决方案的Nuget程序包...
,切换到更新
标签,勾选包括预发行版
(因为OsharpNS处于预发行状态,只更新Osharp相关的即可,其他的预发行的包别去用)
Angular6的前端项目启动
使用MySql作为数据库实例
- 删除
CanDoo.Test.Web
项目Migrations
目录下的所有文件(这里的文件是之前按照SqlServer来生成的)
- 删除
CanDoo.Test.Web
项目Startups
目录下的SqlServer开头的2个文件(去掉SqlServer-DefaultDbContext迁移模块)
- 引用
CanDoo.Test.Web
项目Startups
目录下的MySql开头的2个文件(引入MySql-DefaultDbContext迁移模块)
- 修改
appsettings.Development.json
文件中的连接串
- 打开
程序包管理器控制台
,位于工具
-Nuget包管理器
-程序包管理器控制台
- 在
程序包管理器控制台
执行add-migration init
,生成数据库迁移脚本
- 在
程序包管理器控制台
执行update-database
,执行数据库迁移的脚本
- 运行项目
CanDoo.Test.Web
,如果能看到Swagger
说明运行成功,自己再到MySql看看对应的数据库是否生成
补充说明:当实体字段调整之后,如果要修改数据库,重复执行6,7的操作,可以完成数据库的更新
多上下文配置实例
-. 项目CanDoo.Test.Core
通过Nuget添加对包OsharpNS
的引用
-. 配置文件appsettings.Development.json
中添加OSharp:DbContexts:MySqlAudit
连接参数
"MySqlAudit": {
"DbContextTypeName": "CanDoo.Test.Core.Entity.MySqlAuditDbContext,OSharp.EntityFrameworkCore",//这里要注意下
"ConnectionString": "Server=localhost;Port=3306;UserId=root;Password=******;Database=CanDoo.Test.Audit;charset='utf8';Allow User Variables=True",
"DatabaseType": "MySql",
"LazyLoadingProxiesEnabled": true,
"AuditEntityEnabled": true,
"AutoMigrationEnabled": true
}
-. 新建CanDoo.Test.Core.Entity.MySqlAuditDbContext
上下文
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using OSharp.Entity;
namespace CanDoo.Test.Core.Entity
{
public class MySqlAuditDbContext : DbContextBase
{
public MySqlAuditDbContext(DbContextOptions options, IEntityManager entityManager, IServiceProvider serviceProvider) : base(options, entityManager, serviceProvider)
{
}
}
}
-. 创建CanDoo.Test.Web.Startups.MySqlAuditMigrationPack
迁移模块
using System;
using OSharp.Entity;
using OSharp.Entity.MySql;
using CanDoo.Test.Core.Entity;
using CanDoo.Test.Web.Startups;
namespace CanDoo.Test.Web.Startups
{
/// <summary>
/// MySqlAudit迁移模块
/// </summary>
public class MySqlAuditMigrationPack : MigrationPackBase<MySqlAuditDbContext>
{
/// <summary>
/// 获取 模块启动顺序,模块启动的顺序先按级别启动,级别内部再按此顺序启动,
/// 级别默认为0,表示无依赖,需要在同级别有依赖顺序的时候,再重写为>0的顺序值
/// </summary>
public override int Order => 2;
protected override DatabaseType DatabaseType { get; } = DatabaseType.MySql;
protected override MySqlAuditDbContext CreateDbContext(IServiceProvider scopedProvider)
{
return new MySqlAuditDesignTimeDbContextFactory(scopedProvider).CreateDbContext(new string[0]);
}
//针对多库连接的,需要在EntityConfiguration部分增加以下代码,指定DbContext
//public override Type DbContextType { get; } = typeof(MySqlAuditDbContext);
}
}
using System;
using System.Reflection;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using OSharp.Core.Options;
using OSharp.Data;
using OSharp.Entity;
using OSharp.Exceptions;
using OSharp.Extensions;
using OSharp.Reflection;
using CanDoo.Test.Core.Entity;
namespace CanDoo.Test.Web.Startups
{
public class MySqlAuditDesignTimeDbContextFactory : DesignTimeDbContextFactoryBase<MySqlAuditDbContext>
{
private readonly IServiceProvider _serviceProvider;
public MySqlAuditDesignTimeDbContextFactory()
{ }
public MySqlAuditDesignTimeDbContextFactory(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
public override string GetConnectionString()
{
if (_serviceProvider == null)
{
IConfiguration configuration = Singleton<IConfiguration>.Instance;
string str = configuration["OSharp:DbContexts:MySqlAudit:ConnectionString"]; //这里是配置节点的信息 记得修改
return str;
}
OsharpOptions options = _serviceProvider.GetOSharpOptions();
OsharpDbContextOptions contextOptions = options.GetDbContextOptions(typeof(DefaultDbContext));
if (contextOptions == null)
{
throw new OsharpException($"上下文“{typeof(MySqlAuditDbContext)}”的配置信息不存在");
}
return contextOptions.ConnectionString;
}
public override IEntityManager GetEntityManager()
{
if (_serviceProvider != null)
{
return _serviceProvider.GetService<IEntityManager>();
}
IEntityConfigurationTypeFinder typeFinder = new EntityConfigurationTypeFinder(new AppDomainAllAssemblyFinder());
IEntityManager entityManager = new EntityManager(typeFinder);
entityManager.Initialize();
return entityManager;
}
public override bool LazyLoadingProxiesEnabled()
{
if (_serviceProvider == null)
{
IConfiguration configuration = Singleton<IConfiguration>.Instance;
return configuration["OSharp:DbContexts:MySqlAudit:LazyLoadingProxiesEnabled"].CastTo(false); //这里是配置节点的信息 记得修改
}
OsharpOptions options = _serviceProvider.GetOSharpOptions();
OsharpDbContextOptions contextOptions = options.GetDbContextOptions(typeof(DefaultDbContext));
if (contextOptions == null)
{
throw new OsharpException($"上下文“{typeof(MySqlAuditDbContext)}”的配置信息不存在");
}
return contextOptions.LazyLoadingProxiesEnabled;
}
public override DbContextOptionsBuilder UseSql(DbContextOptionsBuilder builder, string connString)
{
string entryAssemblyName = Assembly.GetExecutingAssembly().GetName().Name;
Console.WriteLine($"entryAssemblyName: {entryAssemblyName}");
return builder.UseMySql(connString, b => b.MigrationsAssembly(entryAssemblyName));
}
}
}
-. 审计功能相关的表使用新的上下文,CanDoo.Test.EntityConfiguration.Systems
中Audit开头的3个文件都增加以下配置代码,指定使用MySqlAuditDbContext
public override Type DbContextType { get; } = typeof(MySqlAuditDbContext); //新增此行代码 指定使用MySqlAuditDbContext 未指定的还是使用DefaultDbContext
using System;
using System.Collections.Generic;
using System.Text;
using CanDoo.Test.Core.Entity;
using CanDoo.Test.Systems.Entities;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using OSharp.Entity;
namespace CanDoo.Test.EntityConfiguration.Systems
{
public class AuditPropertyConfiguration : EntityTypeConfigurationBase<AuditProperty, Guid>
{
public override Type DbContextType { get; } = typeof(MySqlAuditDbContext); //新增此行代码 指定使用MySqlAuditDbContext 未指定的还是使用DefaultDbContext
/// <summary>
/// 重写以实现实体类型各个属性的数据库配置
/// </summary>
/// <param name="builder">实体类型创建器</param>
public override void Configure(EntityTypeBuilder<AuditProperty> builder)
{
builder.HasIndex(m => m.AuditEntityId);
builder.HasOne(m => m.AuditEntity).WithMany(n => n.Properties).HasForeignKey(m => m.AuditEntityId);
}
}
}
-. 在程序包管理控制台中执行Add-Migration -Context MySqlAuditDbContext newDbContext
,创建迁移脚本,因系统中存在2个DbContext,所以需要指定上下文-Context MySqlAuditDbContext
-. 在程序包管理控制台中执行update-database -Context MySqlAuditDbContext