首页 > 其他分享 >规约 Specification

规约 Specification

时间:2022-11-12 14:12:09浏览次数:37  
标签:set string get 规约 ToExpression Specification public

第一次看到这个词 Specification 是在ABP框架中,起先没怎么太关注这个。

随着接触DDD领域驱动越来越来多,关于如何集中业务逻辑的问题,再次浮现在我脑中。

好吧,我不知道。

我知道如何使用很挫的方式集中业务逻辑,问题是业务越来越大时,“这种很挫的方式集中业务逻辑” 的这一种方法将会使业务逻辑代码变得乱七八糟。

而这种乱七八糟的代码的终点是 “屎山” 。没错,“屎山” 就是巨难整,看着就让人生厌的东西,如果有位后来者看见这玩意,我相信他会骂上一句,然后......

但愿这次学习和以后的使用 Specification 可以帮助我更上一层楼吧。

ISpecification<T> 规约定义

    public interface ISpecification<T>
    {
        bool IsSatisfiedBy(T entity);

        Expression<Func<T, bool>> ToExpression();
    }

Specification<T>抽象类

    /// <summary>
    /// This base specification implements the IsSatisfiedBy method by compiling the expression from ToExpression.
    ///
    /// This is useful for general specifications to prevent duplicated logic.
    /// Beware that it is not very performant in situations where many specifications are dynamically constructed and combined.   
    /// </summary>
    /// <remarks>
    /// see this project https://github.com/elsa-workflows/elsa-core .
    /// </remarks>
    public abstract class Specification<T> : ISpecification<T>
    {private Func<T, bool>? _predicate;
        public virtual bool IsSatisfiedBy(T entity)
        {
            _predicate ??= ToExpression().Compile();
            return _predicate(entity);
        }
        public abstract Expression<Func<T, bool>> ToExpression();

        public static implicit operator Expression<Func<T, bool>>(Specification<T> specification)
        {
            return specification.ToExpression();
        }
    }

具体例子

例如,创建一Project类

    public class Project
    {
        public string Id { get; set; }

        public string Name { get; set; }

        public int Size { get; set; }

        public ProjectType ProjectType { get; set; }
    }

    public enum ProjectType
    {
        A,
        B,
        C,
    }

创建一个用于判断Project  id的规约类

    public class ProjectIdSpecification : Specification<Project>
    {
        public string ProjectId { get; }

        public ProjectIdSpecification(string projectId)
        {
            ProjectId = projectId;
        }

        public override Expression<Func<Project, bool>> ToExpression()
        {
            return project => project.Id == ProjectId;
        }
    }
 

  

标签:set,string,get,规约,ToExpression,Specification,public
From: https://www.cnblogs.com/youlicc/p/16878934.html

相关文章

  • masm specification
    masmspecification目录1.preparedosbox1.1setmasmdriver1.2setourownworkspace1.3forwardtoworkspaceandset(masm)path2.compile.asminto.objlinke......
  • 从阿里规约看Spring事务
    目标:事务失效引发的灾难H4如下图(张三--->李四转账)tips下订单-------订单支付-----减库存(失败)超卖现象代码回忆://实现类publicclassUserServiceImplimplements......
  • 潘加宇“用例规约高阶”幻灯片
    ......
  • ServletContext接口规约
    Servlet4.0的ServletContext对象4.1ServletContext接口简介ServletContext是定义Servlet运行的WebApplication的视图。ServletContainer有义务提供ServletContext实现类。......
  • 单元测试规约
    单元测试规约单元测试单元测试遵守AIR原则【强制】好的单元测试必须遵守AIR原则。说明:单元测试在线上运行时,感觉像空气(AIR)一样感觉不到,但在测试质量的保障上,却是非......
  • 安全规约
    安全规约用户数据用户个人的页面【强制】隶属于用户个人的页面或者功能必须进行权限控制校验。说明:防止没有做水平权限校验就可随意访问、修改、删除别人的数据,比如查......
  • 异常日志-日志规约
    异常日志-日志规约使用日志框架SLF4J【强制】应用中不可直接使用日志系统(Log4j、Logback)中的API,而应依赖使用日志框架(SLF4J、JCL--JakartaCommonsLogging)中的API,使......
  • MySQL 数据库-ORM 映射规约
    MySQL数据库-ORM映射规约字段POJO类的布尔属性不能加is,而数据库字段必须加is_【强制】POJO类的布尔属性不能加is,而数据库字段必须加is_,要求在resultMap中进行......
  • MySQL 数据库-SQL 语句规约
    MySQL数据库-SQL语句规约统计标准统计行数的语法count(*)【强制】不要使用count(列名)或count(常量)来替代count(*),count(*)是SQL92定义的标准统计行数的语法,跟......
  • The bean 'ip-service.FeignClientSpecification' could not be registered. A bean w
    idea建议Considerrenamingoneofthebeansorenablingoverridingbysettingspring.main.allow-bean-definition-overriding=true使用改方案,可能会导致后加载的bea......