外观
基础脚手架架构思路
思路
遵循清晰的分层架构,开闭原则。每一层都应该有自己的单一职责,并通过接口依赖注入实现松耦合
领域驱动? 业务没那么复杂,领域驱动反而复杂了!领域驱动DDD
- 入口层
- 调用核心层的服务对象返回注入
- 入口.样式层
- 一些公共的自定义控件、转换器
- 模块层
- 各个系统的模块
- 模块1
- 模块2
- ...
- 核心层
- 被入口层引用,为系统提供数据及插件支撑
- 包含服务接口给展示层调用,接口需要数据库访问类库实现
- 共享模型(DTO)
- Entity实体
- 扩展函数,调用各个层比如sqlsugar的注入
- 核心层.扩展
- 包含公共的一些扩展函数,工具类
- 数据层(sqlsugar)
- 数据访问的相关配置,为核心层做支撑
问题
使用
特性
- 全局json配置文件自动合并
- 自动注入接口与实现
- 数据库种子数据生成
mapster 对象映射
新建类实现IRegister接口即可
public class ExampleMapper : IRegister
{
public void Register(TypeAdapterConfig config)
{
//d代表目标对象,s是源对象
config.ForType<Example, ExampleDto>()
.Map(d => d.Content, s => s.Content + ",该内容是经过Mapster处理的!")
.Map(d => d.IsEnableStr, s => s.IsEnable ? "启用中" : "已禁用");
}
}在使用Example -> ExampleDto时生效 结果: 
也可以手动写
TypeAdapterConfig<TSource, TDestination>
.NewConfig() //会覆盖其他的配置 使用ForType() 不会覆盖
.Ignore(dest => dest.aaa)
.Map(dest => dest.FullName, src => string.Format("{0} {1}", src.FirstName, src.LastName));更多用法参考文档: 高性能对象映射框架 - Mapster
种子数据
在Database.json中将库的EnableInitSeed属性设置true即可初始化种子数据
//实现接口ISqlEntitySeedData,带上表实体即可
public class SysUserSeedData : ISqlEntitySeedData<Example>
{
public IEnumerable<Example> HasData()
{
//写主键 可以根据逐渐更新数据,不加主键的情况下,开启初始化
return new[] {
new Example { Id = 1, Content = "内容a", Count = 1 },
new Example { Id = 2, Count = 12 },
new Example { Id = 3, Count = 13 },
};
}
}前端
基础类
BaseViewModel:所有viewmodel可继承,或扩展,主要用于申明注入所有页面常用对象或属性
扩展函数
枚举:有个枚举绑定数组的、自动随机生成指定长度枚举数组- 使用:
<UserControl ...
xmlns:enumEx="clr-namespace:BasisFrame.WPF.Infrastructure.Enums;assembly=BasisFrame.WPF.Infrastructure"
.../>
<UserControl.Resources>
<enum:EnumBindingSource x:Key="OneEnumEnumOptions" EnumType="{x:Type enum:OneEnum}"/>
</UserControl.Resources>
<ComboBox DisplayMemberPath="Key" SelectedValuePath="Value" ItemsSource="{Binding Source={StaticResource OneEnumEnumOptions}}" />
</UserControl>public enum OneEnum
{
[Description("项1")]
Item1,
[Description("项2")]
Item2,
[Description("项3")]
Item3,
}
