1 Star 0 Fork 296

美邦帅帅 / Magicodes.Admin.Core

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
3.模型设计.md 9.04 KB
一键复制 编辑 原始数据 按行查看 历史
Tom 提交于 2018-09-19 15:11 . 更新 3.模型设计.md

模型设计

编辑者 说明 时间
闵滔滔

接口

接口必须有子类,子类使用用implements进行接口实现,一个子类可以同时实现多个接口 public interface IStudentAppService : IApplicationService

IEntity

事实上Entity 实现了IEntity 接口(和Entity 实现了 IEntity接口)。如果你不想从Entity 类派生,你能直接的实现这些接口。其他实体类也可以实现相应的接口。但是不建议你用这种方式。除非你有一个很好的理由不从Entity 类派生。

IFullAudited

如果你想为一个实体实现所有的接口(创建,修改和删除),那么可以直接实现IFullAudited,因为它继承了所有的这些接口:

public interface IFullAudited : IAudited, IDeletionAudited {

} 作为一个快捷方式,你可以直接从FullAuditedEntity 类派生你的实体类,因为该类已经实现了IFullAudited接口。

注意:所有的审计接口和类都有一个定义导航属性到User实体的泛型版本(比如ICreationAudited和FullAuditedEntity<tprimarykey,tuser>)。

IMayHaveTenant

如果你正在创建多租户应用并存储所有租户数据在一个数据库里,你明确地不想一个租户的数据意外地被另一个租户看到,这种情况下你可用IMustHaveTenant。例如:

public class Product : Entity, IMustHaveTenant { public int TenantId { get; set; }

public string Name { get; set; }

}

IMustHaveTenant定义了TenantId,区别不同的租户实体。ABP默认情况下使用IAbpSeesion获取当前TenantId,并自动为当前租户过滤查询。

何时可用?

IMustHaveTenant默认可用。

如果当前用户尚未登录系统或当前是个宿主用户(宿主用户是一个更高级别的用户,它管理租户和租户数据),ABP自动禁用IMustHaveTenant过滤,因此,可以获取所有租户的所有数据。注意:这与安全性无关,你应当一直授权敏感数据。

IMayHaveTenant

如果一个实体类被租户和宿主共享(也就是说一个实体对象可被租户或宿主拥有),你可以使用IMayHaveTenant过滤。IMayHaveTenant接口定义了TenantId,但它是可空的。

public class Role : Entity, IMayHaveTenant { public int? TenantId { get; set; }

public string RoleName { get; set; }

}

一个null值表示这是个宿主实体,一个非null值表示这个实体被Id为TenantId的租户拥有。默认情况下,ABP使用IAbpSeesion获取当前TenantId。IMayHaveTenant过滤不像IMustHaveTenant那么通用,但在实体类型通用宿主和租户时,需要它。

如何可用?

IMayHaveTenant一直可用,除非你显式禁用它。

特性

特性(Attributes)是一种崭新的声明性信息。我们不仅可以通过特性来定义设计层面的信息(例如help file, URL for documentation)以及运行时(run-time)信息(例如使XML与class相联系),而且我们还可以利用特性建立自描述(self- describing)组件。 [MaxLength(30)],设置数据的最大长度 [Required],字段为非空字段 [Display(Name = "名称")],显示属性 [DataType(DataType.Date)] ,指定数据显示格式 [EmailAddress] ,邮件址验证,能提供服务端与客户端的验证。 [DataType(DataType.MultilineText)] ,指定类型为多行字码 [RegularExpression(@"^[1-9][0-9]{5,9}$",ErrorMessage="你输入的不是有效的QQ号码")] 正则表达式验证 public string Name { get; set; }

Required

ef的模型是数据库那边用的。设置Required就是进入数据库的环节必须赋值。

示例

创建Student实体

  1. 在领域层创建Student文件夹,并创建Student实体类;
  2. Student实体类继承自于EntityBase,而EntityBase继承自于Entity同时还实现了IFullAudited和IMayHaveTenant接口(Magicodes.Admin.Core框架是基于ABP和ASP.NET Zero的基础上进行了封装和完善,ABP中所有的实体类都继承自Entity,而Entity实现了IEntity接口;而IEntity接口是一个泛型接口,通过泛型指定主键Id类型,默认的Entity的主键类型是int类型。通过实现审计接口IFullAudited指定创建者,创建时间,修改者,修改时间及删除者,删除时间,是否删除[软删除]基本信息,通过实现IMayHaveTenant来指定租户信息) 代码如下:
 namespace Magicodes.Admin.Tutorial.Student
{
    public class StudentInfo:Entity<long>
    {
        /// <summary>
        /// 姓名
        /// </summary>
        [Display(Name = "姓名")]
        [Required]
        [MaxLength(50)]
        public string Name { get; set; }
        /// <summary>
        /// 出生日期
        /// </summary>
        [Display(Name = "出生日期")]
        [Required]
        public DateTime BirthDate { get; set; }
        /// <summary>
        /// 性别
        /// </summary>
        [Display(Name="性别")]
        [Required]
        public Genders Genders { get; set; }
    }

    public enum Genders
    {
        /// <summary>
        /// 男
        /// </summary>
        Male=0,
        /// <summary>
        /// 女
        /// </summary>
        Female=10
    }
}

其中定义了Genders状态枚举。其中[Required]、[MaxLength]特性是用来进行输入校验的。

创建简单的CMS模型

///

/// 栏目信息 /// [Description("栏目信息")] public class Column : EntityBase { /// /// 类型 /// [MaxLength(30)] [Required] [Display(Name = "类型")] public string Type { get; set; }

    /// <summary>
    ///     名称
    /// </summary>
    [MaxLength(30)]
    [Required]
    [Display(Name = "名称")]
    public string Name { get; set; }

    /// <summary>
    ///     栏目介绍
    /// </summary>
    [MaxLength(1000)]
    [Required]
    [Display(Name = "栏目介绍")]
    public string Content { get; set; }

    /// <summary>
    /// 是否为父级ID
    /// </summary>
    [Display(Name = " 是否为父级ID")]
    public bool IsParent { get; set; }

    /// <summary>
    /// 父级Id
    /// </summary>
    public long? ParentId { get; set; }

///

/// 文章信息 /// [Description("文章信息")] public class Article : EntityBase { /// /// 标题 /// [MaxLength(200)] [Required] [Display(Name = "标题")] public string Title { get; set; }

    /// <summary>
    ///     文章标题图片
    /// </summary>
    [MaxLength(200)]
    [Display(Name = "文章标题图片")]
    public string Image { get; set; }

    /// <summary>
    ///     文章简介
    /// </summary>
    [MaxLength(2000)]
    [Display(Name = "文章简介")]
    public string Summary { get; set; }

    /// <summary>
    ///     内容
    /// </summary>
    [DataType(DataType.Html)]
    [Required]
    [Display(Name = "内容")]
    public string Content { get; set; }

    /// <summary>
    /// 栏目Id
    /// </summary>
    public long? ColumnId { get; set; }

    [ForeignKey("ColumnId")]
    public Column Column { get; set; }

    /// <summary>
    /// 文件Id
    /// </summary>
    public long? FileId { get; set; }
}

///

/// 基础模型 /// /// public abstract class EntityBase : Entity, IFullAudited, IMayHaveTenant { /// /// 创建者UserId /// [Display(Name ="创建者UserId")] public long? CreatorUserId { get; set; }

    /// <summary>
    /// 创建时间
    /// </summary>
    [Display(Name ="创建时间")]
    public DateTime CreationTime { get; set; }

    /// <summary>
    /// 最后修改者UserId
    /// </summary>
    [Display(Name ="最后修改者UserId")]
    public long? LastModifierUserId { get; set; }

    /// <summary>
    /// 最后修改时间
    /// </summary>
    [Display(Name ="最后修改时间")]
    public DateTime? LastModificationTime { get; set; }

    /// <summary>
    /// 删除者UserId
    /// </summary>
    [Display(Name ="删除者UserId")]
    public long? DeleterUserId { get; set; }

    /// <summary>
    /// 删除时间
    /// </summary>
    [Display(Name ="删除时间")]
    public DateTime? DeletionTime { get; set; }

    /// <summary>
    /// 是否删除
    /// </summary>
    [Display(Name ="是否删除")]
    public bool IsDeleted { get; set; }

    /// <summary>
    /// 租户Id
    /// </summary>
    [Display(Name ="租户Id")]
    public int? TenantId { get; set; }
}

}

C#
1
https://gitee.com/meibangshuaishuai/Magicodes.Admin.Core.git
git@gitee.com:meibangshuaishuai/Magicodes.Admin.Core.git
meibangshuaishuai
Magicodes.Admin.Core
Magicodes.Admin.Core
develop

搜索帮助