中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#中怎么利用Specification模式定制業務邏輯

發布時間:2021-07-08 15:36:01 來源:億速云 閱讀:243 作者:Leah 欄目:編程語言

這篇文章給大家介紹C#中怎么利用Specification模式定制業務邏輯,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

這里將要講述的是怎樣用C#中的Specification模式實現可定制的業務邏輯,也就是避免傳統where語句的局限性,在一定程度上是有其價值的。

今天有朋友在問了我這么一個問題:怎么實現OrWhere的功能?我猜測,他的意思是要實現這樣的功能:

static IEnumerable<int> MorePredicate(IEnumerable<int> source)  {      return source.OrWhere(i => i > 0); // 或所有的正數  }   static void Main(string[] args)  {      var array = Enumerable.Range(-5, 10).ToArray();      var odd = array.Where(i => i % 2 != 0);  // 排除所有偶數      var oddOrPositive = MorePredicate(odd);       foreach (var i in oddOrPositive)      {          Console.WriteLine(i);      }  }

以上代碼應該輸出-5,-3,-1,1,2,3,4。但顯然,這段代碼是無法編譯通過,無法通過補充類庫來實現的。因為在Main方法中的Where過后,已經排除了所有的偶數,于是在接下來的代碼中是無法從新的序列中再次恢復元素的。

不過這個要求讓我想起了Specification模式。Specification模式的作用是構建可以自由組裝的業務邏輯元素。Specification類有一個IsSatisifiedBy函數,用于校驗某個對象是否滿足該Specification所表示的條件。多個Specification對象可以組裝起來,并生成新Specification對象,這便可以形成高度可定制的業務邏輯。例如,我們可以使用依賴注入(控制反轉)的方式來配置這個業務邏輯,以此保證系統的靈活性。

如果您點開上面那個Wikipedia的鏈接,就會發現這段描述大約是一個英譯中的練習。抄完了“定義”,再來看看同樣引自Wikipedia的UML圖:

C#中怎么利用Specification模式定制業務邏輯

一般來說,Specification模式則意味著實現這樣一個接口:

public interface ISpecification {      bool IsSatisfiedBy(T candidate);       ISpecification And(ISpecification other);       ISpecification Or(ISpecification other);       ISpecification Not();  }

實現了ISpecification的對象則意味著是一個Specification,它可以通過與其他Specification對象的And,Or或對自身的取反來生成新的邏輯。為了方便這些“組合邏輯”的開發,我們還會準備一個抽象的CompositeSpecification類:

public abstract class CompositeSpecification : ISpecification  {      public abstract bool IsSatisfiedBy(T candidate);       public ISpecification And(ISpecification other)      {          return new AndSpecification(this, other);      }       public ISpecification Or(ISpecification other)      {          return new OrSpecification(this, other);      }       public ISpecification Not()      {          return new NotSpecification(this);      }  }

CompositeSpecification提供了構建復合Specification的基礎邏輯,它提供了And、Or和Not方法的實現,讓其他Specification類只需要專注于IsSatisfiedBy方法的實現即可。例如,以下便是三種邏輯組合的具體實現:

public class AndSpecification : CompositeSpecification  {      private ISpecification m_one;      private ISpecification m_other;       public AndSpecification(ISpecification x, ISpecification y)      {          m_one = x;          m_other = y;      }       public override bool IsSatisfiedBy(T candidate)      {          return m_one.IsSatisfiedBy(candidate) && m_other.IsSatisfiedBy(candidate);      }  }   public class OrSpecification : CompositeSpecification  {      private ISpecification m_one;      private ISpecification m_other;       public OrSpecification(ISpecification x, ISpecification y)      {          m_one = x;          m_other = y;      }       public override bool IsSatisfiedBy(T candidate)      {          return m_one.IsSatisfiedBy(candidate) || m_other.IsSatisfiedBy(candidate);      }  }   public class NotSpecification : CompositeSpecification  {      private ISpecification m_wrapped;       public NotSpecification(ISpecification x)      {          m_wrapped = x;      }       public override bool IsSatisfiedBy(T candidate)      {          return !m_wrapped.IsSatisfiedBy(candidate);      }  }

于是,我們便可以使用Specification模式來處理剛才那位朋友的問題。例如,首先他需要排除所有的偶數,那么我們不妨實現一個OddSpecification:

public class OddSpecification : CompositeSpecification  {      public override bool IsSatisfiedBy(int candidate)      {          return candidate % 2 != 0;      }  }

自然,還有用于獲得所有正數的Specification類:

public class PositiveSpecification : CompositeSpecification  {      public override bool IsSatisfiedBy(int candidate)      {          return candidate > 0;      }  }

于是在使用時,我們會將其通過Or方法組合起來:

static ISpecification MorePredicate(ISpecification original)  {      return original.Or(new PositiveSpecification());  }   static void Main(string[] args)  {      var array = Enumerable.Range(-5, 10).ToArray();      var oddSpec = new OddSpecification();      var oddAndPositiveSpec = MorePredicate(oddSpec);       foreach (var item in array.Where(i => oddAndPositiveSpec.IsSatisfiedBy(i)))      {          Console.WriteLine(item);      }  }

但是,您覺得這個做法怎么樣?我覺得過于殺雞用牛刀,高射炮打蚊子了。Specification模式雖然常用,但是用在這里太重量級了。如果我們為每一個函數都補充一個Specification類,至少會讓我感到厭倦。

關于C#中怎么利用Specification模式定制業務邏輯就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宁远县| 铜鼓县| 班戈县| 聂荣县| 鹤山市| 威宁| 万载县| 宜兰市| 蕲春县| 隆化县| 双牌县| 凌云县| 从江县| 赞皇县| 菏泽市| 新津县| 宜川县| 华宁县| 聂拉木县| 深泽县| 中卫市| 崇信县| 白城市| 水城县| 荥经县| 分宜县| 孙吴县| 辽中县| 贺州市| 柳林县| 长宁县| 巴林左旗| 广平县| 乌什县| 鄂州市| 栾城县| 招远市| 搜索| 漳平市| 昂仁县| 罗城|