基于业务基础项目创建
一. 使用VS2019创建项目
1.1 选择ASP.NET CORE Web应用程序,如图1.1.1
图1.1.1
1.2 项目尽量以CloudHill.Project.YourProjectName.Web空间命名,如图1.2.1
图1.2.1
1.3 选择空项目完成基础创建,如图1.3.1
图1.3.1
二.使用CodeSmith生成基础文件
2.1 CodeSmith模板地址:/svn/Framework/CodeSmithTemplate/trunk/EFCore3.1
2.2 使用数据里连接业务表,CodeSmith数据库连接串示例如下,如图2.2.1
Data Source=数据库IP;Initial Catalog=数据库表名;User ID=数据库账号;Password=数据库密码
图 2.2.1
2.3 命名空间尽量使用:CloudHill.Project.YourProjectName,如图2.3.1
图 2.3.1
2.4 执行生成结果,如图2.4.1
图 2.4.1
三.将Entity层引入项目
3.1 创建Entity类库项目
3.2 命名空间尽量使用:CloudHill.Project.YourProjectName.Entity
3.3 将Codesmith生成的Entity内容粘贴进CloudHill.Project.YourProjectName.Entity
[如图3.1.1-3.1.2]
图 3.1.1
图 3.1.2
四.将Dao层引入项目
4.1 创建Dao类库项目
4.2 命名空间尽量使用:CloudHill.Project.YourProjectName.Dao
4.3 将Codesmith生成的Dao内容粘贴进CloudHill.Project.YourProjectName.Dao
4.4 将CloudHill.Project.YourProjectName.Entity添加进CloudHill.Project.YourProjectName.Dao的引用
4.5 安装Nuget包,如代码块4.1.2
4.6 核查4.1.3代码块
[如图4.1.1-4.1.4]
Install-Package CloudHill.NetCore.Utils -Project CloudHill.Project.YourProjectName.Dao
Install-Package Microsoft.EntityFrameworkCore -Project CloudHill.Project.YourProjectName.Dao -Version 3.1.3
//如果需要使用MSSQL则使用下方代码
Install-Package Microsoft.EntityFrameworkCore.SqlServer -Project CloudHill.Project.YourProjectName.Dao -Version 3.1.3
//如果需要使用MYSQL则使用下方代码
Install-Package Pomelo.EntityFrameworkCore.MySql -Project CloudHill.Project.YourProjectName.Dao -Version 3.1.2
代码块 4.1.2
图 4.1.1
图 4.1.2
public YourProjectNameEntities()
{
//记住该字符串配置
m_ProviderName = "YourProjectNameEntities";
}
public YourProjectNameEntities(string providerName)
{
m_ProviderName = providerName;
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
var dbType = AppsettingsHelper.GetInfo("DB:Type");
dbType = dbType == null ? string.Empty : dbType;
var conn = AppsettingsHelper.GetInfo("ConnectionStrings:" + m_ProviderName);
switch (dbType.ToLower())
{
case "mssql": optionsBuilder.UseSqlServer(conn); break;
//不使用mysql注释即可
//case "mysql": optionsBuilder.UseMySql(conn); break;
default: optionsBuilder.UseSqlServer(conn); break;
}
}
代码块 4.1.3
五.将Service层引入项目
5.1 创建Service类库项目
5.2 命名空间尽量使用:CloudHill.Project.YourProjectName.Service
5.3 将Codesmith生成的Service内容粘贴进CloudHill.Project.YourProjectName.Service
5.4 将CloudHill.Project.YourProjectName.Dao添加进CloudHill.Project.YourProjectName.Service的引用
5.5 安装Nuget包,如代码块5.1.2
[如图5.1.1-5.1.2]
图 5.1.1
Install-Package CloudHill.NetCore.Utils -Project CloudHill.Project.YourProjectName.Service
代码块5.1.2
六.将Web层引入项目
6.1 将Codesmith生成的YourProjectNameWeb内容粘贴进CloudHill.Project.YourProjectName.Web
6.2 将CloudHill.Project.YourProjectName.Service添加进CloudHill.Project.YourProjectName.Web的引用
6.3 安装Nuget包,如代码块6.1.1
6.4 将6.1.2代码块替换Program.cs对应内容
6.5 将6.1.3代码块替换Startup.cs对应内容
[如图6.1.1-6.1.4]
Install-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson -Project CloudHill.Project.YourProjectName.Web -Version 3.1.3
Install-Package CloudHill.NetCore.Utils -Project CloudHill.Project.YourProjectName.Web
代码块6.1.1
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
//为了使用AspectCore aop
.UseServiceProviderFactory(new DynamicProxyServiceProviderFactory());
}
代码块6.1.2
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
//注册Colletcion
IocProxyFactory.SetServiceCollection(services);
//注册为了使用UserHttpContext
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
//注册用户信息上下文
IocProxyFactory.SetService<IUserDataContext, UserDataContext>();
//注册所有IOC对应关系
services.BuildIOC();
//注册AOP
services.ConfigureDynamicProxy();
//启动每个项目的初始化程序
services.InitWebSite();
//注册为了使用MVC的View
services.AddControllersWithViews();
//注册全局监控异常
services.AddMvc(option =>
{
option.Filters.Add(typeof(GlobalExceptionFilter));
option.EnableEndpointRouting = false;
});
//解决JSON返回值大小写问题,以把编码格式问题
services.AddMvc().AddNewtonsoftJson(options =>
{
// 忽略循环引用
options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
// 不使用驼峰
options.SerializerSettings.ContractResolver = new DefaultContractResolver();
});
//设置前台Memberbase的认证cookies,使用了MemberBaseController需要使用下方代码
services.AddAuthentication().AddCookie("Member");
//设置后台base的认证cookies,使用了BaseController需要使用下方代码
services.AddAuthentication().AddCookie("Base");
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
//使用了Cookies权限认证
app.UseAuthentication();
// 注册为了使用UserHttpContext
app.UseInjectionServiceProvider(app.ApplicationServices.GetService<IServiceProvider>());
//使用静态文件
app.UseStaticFiles();
//注册但不限于Cms,Sys,Evaluation,Weixin的路由
app.RegisterRouter();
//使用默认路由
app.UseMvcWithDefaultRoute();
//注册areas下的自定义路由
app.UseMvc(routes =>
{
routes.MapAreaRoute(
name: "areas",
//需要根据实际文件夹名称自定义
areaName: "yourProjectName",
template: "yourProjectName/{controller}/{action}/{id?}"
);
});
//注册Provider,一定在所有Service注册完成后调用
IocProxyFactory.InitServiceProvider();
//若使用Paas功能,获取Nuget包:CloudHill.PaaS.Identity4.NetCore,并初始化SDK
CloudHillPaasHandler.Instance.Run("AppID","AppSecret");
}
}
代码块6.1.3
图 6.1.4
七.配置appsettings.json
7.1 将7.1.1代码块替换appsettings.json对应内容
{
"AllowedHosts": "*",
"ConnectionStrings": {
//代码块4.1.3中得Entities
"YourProjectNameEntities": "Server=数据库IP;Database=数据库名称;User id=数据库账号;password=数据库密码",
},
"Log4net": { "FilePath": "app.config" },
//mssql:使用mssql mssql:使用mysql 注意取消代码块4.1.3对应数据库选项
"DB": { "Type": "mssql" }
}
7.1.1代码块
八.配置app.config
8.1 新建app.config
8.2 将8.1.1代码块替换app.config对应内容
[如图8.1.1-8.1.2]
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
<section name="CloudHill.Framework.CommonPlatformConfig" type="CloudHill.NetCore.Utils.Config.CMSConfigurationSectionHandler, CloudHill.NetCore.Utils" />
</configSections>
<CloudHill.Framework.CommonPlatformConfig>
<SiteConfig>
<GlobalInit>
<Assemblys>
<Assembly name="NetCore.Utils" value="CloudHill.NetCore.Utils" />
</Assemblys>
</GlobalInit>
<Unity>
<Assemblys>
<!--注意需要配置对应项目都得Service和Dao进行IOC映射-->
<Assembly name="CloudHill.Project.YourProjectName.Service" value="CloudHill.Project.YourProjectName.Service" />
<Assembly name="CloudHill.Project.YourProjectName.Dao" value="CloudHill.Project.YourProjectName.Dao" />
</Assemblys>
</Unity>
</SiteConfig>
</CloudHill.Framework.CommonPlatformConfig>
<log4net>
<logger name="Com" additivity="false">
<level value="INFO" />
<appender-ref ref="ComLogFileAppender" />
</logger>
<logger name="Debug" additivity="false">
<level value="DEBUG" />
<appender-ref ref="DebugLogFileAppender" />
</logger>
<logger name="Logic" additivity="false">
<level value="INFO" />
<appender-ref ref="LogicLogFileAppender" />
</logger>
<appender name="ComLogFileAppender" type="log4net.Appender.RollingFileAppender,log4net">
<param name="File" type="" value="Log/Com/" />
<param name="AppendToFile" value="true" />
<param name="lockingModel" type="log4net.Appender.FileAppender+MinimalLock" />
<param name="RollingStyle" value="Date" />
<param name="DatePattern" value="yyyyMMdd" />
<param name="StaticLogFileName" value="false" />
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="Header" value="" />
<param name="Footer" value="" />
<param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
</layout>
</appender>
<appender name="DebugLogFileAppender" type="log4net.Appender.RollingFileAppender,log4net">
<param name="File" type="" value="Log/Debug/" />
<param name="AppendToFile" value="true" />
<param name="lockingModel" type="log4net.Appender.FileAppender+MinimalLock" />
<param name="RollingStyle" value="Date" />
<param name="DatePattern" value="yyyyMMdd" />
<param name="StaticLogFileName" value="false" />
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="Header" value="" />
<param name="Footer" value="" />
<param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
</layout>
</appender>
<appender name="LogicLogFileAppender" type="log4net.Appender.RollingFileAppender,log4net">
<param name="File" type="" value="Log/Logic/" />
<param name="AppendToFile" value="true" />
<param name="lockingModel" type="log4net.Appender.FileAppender+MinimalLock" />
<param name="RollingStyle" value="Date" />
<param name="DatePattern" value="yyyyMMdd" />
<param name="StaticLogFileName" value="false" />
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="Header" value="" />
<param name="Footer" value="" />
<param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
</layout>
</appender>
</log4net>
<appSettings></appSettings>
</configuration>
代码块 8.1.1
图 8.1.2
九.创建单元测试项目
9.1 创建UnitTest类库项目
9.2 命名空间尽量使用:CloudHill.Project.YourProjectName.UnitTest
9.3 将CloudHill.Project.YourProjectName.Service添加进CloudHill.Project.YourProjectName.UnitTest的引用
9.4 将CloudHill.Project.YourProjectName.Dao添加进CloudHill.Project.YourProjectName.UnitTest的引用
9.5 安装Nuget包,如代码块9.1.1
9.6 将8.1和7.1得app.config和appsettings.json复制一份进单元测试,并将app.config更名为testhost.dll.config
9.7 将testhost.dll.config和appsettings.json设置成"如果较新则复制",如图9.1.4
9.8 简易单元测试例子如代码块9.1.5
[如图9.1.1-9.1.5]
Install-Package CloudHill.NetCore.Utils -Project CloudHill.Project.YourProjectName.UnitTest
代码块 9.1.1
图 9.1.2
图 9.1.3
图 9.1.4
[TestClass]
public class UnitTest1
{
public UnitTest1()
{
IServiceCollection serviceDescriptors = new ServiceCollection();
IocProxyFactory.SetServiceCollection(serviceDescriptors);
serviceDescriptors.BuildIOC();
//注册用户信息上下文
IocProxyFactory.SetService<IUserDataContext, UserDataContext>();
IocProxyFactory.InitServiceProvider();
}
[TestMethod]
public void TestMethod1()
{
UserDataContextHelper.SetUserID(1);
var service = IocProxyFactory.GetService<ILogService>();
var rawData = @"{Command:'',
Data:{
}
}";
var jObject = JObject.Parse(rawData);
var data = (JObject)jObject["Data"];
//调用方法
var ret = service.GetList(data);
Console.ReadKey();
}
}
代码块 9.1.5
至此基础项目准备完毕,如果需要需要继续集成PAAS壳体功能