OsharpNS框架简明入门教程--适合小白和第一次接触

OsharpNS框架入门教程

  1. OsharpNS所需的基础环境 ok
  2. 使用OsharpNS项目模板创建项目 ok
  3. 配置数据库连接串并启动项目 ok
  4. Angular6的前端项目启动
  5. 使用MySql作为数据库实例 ok
  6. 多上下文配置实例 ok
  7. OsharpNS.Swagger使用实例 ok
  8. OsharpNS.Hangfire使用实例
  9. OsharpNS.Redis启用实例
  10. OSharp.Permissions强制注入角色实例

OsharpNS官方资源

  1. 项目地址:https://github.com/i66soft/osharp-ns20
  2. 演示地址:https://www.osharp.org/
  3. 发布博客:https://www.cnblogs.com/guomingfeng/p/osharpns-publish.html
  4. VS插件:https://marketplace.visualstudio.com/items?itemName=LiuliuSoft.osharp

OsharpNS所需的基础环境

  1. OSharpNS始终紧随微软的步伐,使用最新版本的 dotnetcore,请前往[Download .NET (Linux, macOS, and Windows)](https://dotnet.microsoft.com/download,"Download .NET (Linux, macOS, and Windows")点击Download .NET Core SDK下载并安装最新版本的dotnetcore
  2. 下载并安装.net core开发环境(本人使用VS2017/VS2019作为作为OsharpNS的开发环境,欢迎高手提供VS Code开发和调试.net core程序的方法,这环境太庞大)
  3. 下载并安装Angular6的前端开发环境(本人使用VS Code)

使用OsharpNS项目模板创建项目

  1. 在任意空白目录,打开cmd或者powershell命令行窗口
    打开powershell
  2. 执行命令dotnet new -i OSharpNS.Template.Mvc_Angular
    获取命令
  3. 执行命令dotnet new osharp_cmd获取Osharp安装脚本,执行完成后,目录中出现cmd_build.bat文件
    获取安装脚本
  4. 双击cmd_build.bat,并根据要求命名项目名称(也可以根据喜好对项目进行命名,本示例使用CanDoo.Test作为项目名称),完成项目创建
    项目创建完成

配置数据库连接串并启动项目

  1. 打开解决方案CanDoo.Test.sln后,各个工程之间的引用关系已配置好,osharp框架的类库已引用 nuget.org 上的相应版本,并将自动还原好
    自动生成的项目结构
  2. 在解决方案上,右击,点击还原Nuget包,完成相关引用的还原
    还原Nuget包
  3. 在解决方案上,右击,点击属性,更改启动项目为CanDoo.Test.Web
    更改启动项
  4. 打开appsettings.Development.json,对数据库连接串根据实际进行修改(appsettings.json为正式发布时使用的配置文件,调试时使用的是appsettings.Development.json,请注意区分)
    修改连接串
  5. 运行项目CanDoo.Test.Web,如果能看到Swagger说明运行成功(首次启动系统自动创建数据库,初始化相关参数,时间较久)
    运行成功
    补充说明:OsharpNS正在大力完善中,更新比较快,如果需要更新OsharpNS的引用,请点击在解决方案上,右击,点击管理解决方案的Nuget程序包...,切换到更新标签,勾选包括预发行版(因为OsharpNS处于预发行状态,只更新Osharp相关的即可,其他的预发行的包别去用)
    更新Osharp包方法

Angular6的前端项目启动

  1. 这玩意我不会,其他人来补充
  2. 非官方的VUE界面,后期会跟随作者的脚步更新
  3. 官方前端项目请移步查看作者的博客 官方博客

使用MySql作为数据库实例

  1. 删除CanDoo.Test.Web项目Migrations目录下的所有文件(这里的文件是之前按照SqlServer来生成的)
    删除SqlServer迁移代码
  2. 删除CanDoo.Test.Web项目Startups目录下的SqlServer开头的2个文件(去掉SqlServer-DefaultDbContext迁移模块)
    删除SqlServer迁移模块
  3. 引用CanDoo.Test.Web项目Startups目录下的MySql开头的2个文件(引入MySql-DefaultDbContext迁移模块)
    添加MySql迁移模块
    添加MySql迁移模块2
  4. 修改appsettings.Development.json文件中的连接串
    修改连接串
  5. 打开程序包管理器控制台,位于工具-Nuget包管理器-程序包管理器控制台
    打开程序包管理控制台
  6. 程序包管理器控制台执行add-migration init,生成数据库迁移脚本
    生成数据库迁移代码
  7. 程序包管理器控制台执行update-database,执行数据库迁移的脚本
    更新数据库
  8. 运行项目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

猜你喜欢

转载自www.cnblogs.com/candoo/p/10743282.html