当前位置:主页 > 118红姐图厍 > 正文

综合资料 m_SpecList==null

发布时间:2019-06-04作者:admin来源:本站原创点击数:

?c?规格模式(Specification)_知识库_博客园
需求如下:需要从数据库的Cargo表中取出商品名称为“钉子”的货物。可以这样做:public class CargoRepository{ public List SelectByPartName(string partName){}}当需求发生变化了,它要从数据库的Cargo表中取出商品编码为“0001”的货物。可以这样做:public class CargoRepository{ public List SelectByPartCode(string partCode){}}当需求又一次变化了,它要从数据库的Cargo表中取出商品名称为“钉子”并且商品编码为“0001”的货物。这时候问题严重了,看下上面的方法都是一些特定的查询,可能还有很多这样的查询。他们单个的查询通过组合又形成了新的查询。这就是组合爆炸。有两种模式可以解决这样的问题:Specification-[Evans的DDD]和Query Object[Fowler,PEAA],这里只讨论Specification。在DDD一书中提到:(原文如下:业务规则不适于放在任何已有实体或值对象中,而且规则的变化和组合会掩盖那些领域对象的基本含义。)有时经常造成组合爆炸。规格是模型的一部分,将它们从实体或值对象中独立出来有助于使模型更加清楚,它表达的是业务的规则。规格是值对象,它用来判定对象是否满足标准的谓词。谓词是指运算结果为true或false的函数,可以用and、or、not操作符连接。对规格的接口定义:publicinterfaceISpecificationboolisSatisfiedBy(objectcandidate);ISpecificationand(ISpecificationother);ISpecificationor(ISpecificationother);ISpecificationnot();我们期望具体的规格只实现isSatisfiedBy方法,所以定义抽象类:public abstract class AbstractSpecification : ISpecification { #region ISpecification 成员 public abstract bool isSatisfiedBy(object candidate); public ISpecification and(ISpecification other) AndSpecification andSpec = Singleton<AndSpecification>.Instance(); andSpec.SetAndSpecification(this, other); return andSpec; public ISpecification or(ISpecification other) OrSpecification orSpec = Singleton<OrSpecification>.Instance(); orSpec.SetOrSpecification(this, other); return orSpec; public ISpecification not() NotSpecification notSpec = Singleton<NotSpecification>.Instance(); notSpec.SetNotSpecification(this); return notSpec; #endregion}定义操作符谓词:internalclassAndSpecification:AbstractSpecification{ISpecificationone;ISpecificationother;publicvoidSetAndSpecification(ISpecificationx,ISpecificationy)one=x;other=y;publicoverrideboolisSatisfiedBy(objectcandidate)returnone.isSatisfiedBy(candidate)&&other.isSatisfiedBy(candidate);}internalclassOrSpecification:AbstractSpecification{ISpecificationone;ISpecificationother;publicvoidSetOrSpecification(ISpecificationx,ISpecificationy)one=x;other=y;publicoverrideboolisSatisfiedBy(objectcandidate)other.isSatisfiedBy(candidate);}internalclassNotSpecification:AbstractSpecification{ISpecificationwrapped;publicvoidSetNotSpecification(ISpecificationnotSpec)wrapped=notSpec;publicoverrideboolisSatisfiedBy(objectcandidate)return!wrapped.isSatisfiedBy(candidate);}如果使用规格模式,系统中会存在许多小颗粒的规格类。性能会有影响。这里使用享元模式获取规格。publicclassSpecificationFactory{privatestaticreadonlySpecificationFactoryinstance=newSpecificationFactory();privateDictionary<string,ISpecification>m_SpecList;privateSpecificationFactory(){}publicstaticSpecificationFactoryInstance()returninstance;publicISpecificationGetSepcification(stringassembly,stringtype){ISpecificationspec;if(m_SpecList==null)m_SpecList=newDictionary<string,赌神高手论坛资料,ISpecification>();stringkey=assembly+type;if(!m_SpecList.ContainsKey(key)){spec=Assembly.Load(assembly).CreateInstance(type)asISpecification;if(spec!=null)m_SpecList.Add(key,spec);returnspec;thrownewException(type+"规格不存在,请确保存"+assembly+"中存在"+type+"类");}returnm_SpecList[key];}}这里简单的测试:[TestMethod]publicvoidTestSpec()SpecificationFactorysf=SpecificationFactory.Instance();Cargocargo=null;ISpecificationspec=sf.GetSepcification("Bmrxntfj","Bmrxntfj.Specification.NullSpecification");Assert.AreEqual(true,马会四不像图片,spec.isSatisfiedBy(cargo));spec=spec.or(newEqualSpecification());Assert.AreEqual(true,spec.isSatisfiedBy(cargo));cargo=newCargo();cargo.PartCode=2;cargo.PartName="2";Assert.AreEqual(false,spec.isSatisfiedBy(cargo));然而我们却不常这样做。因为有些ORM框架采用对象的属性来查询。在基础结构层中生成SQL,这样我们就不需要这样麻烦了。 ????????? ?
?

上一篇:今晚开码结果查询2018 监管不断加码

下一篇:哈登61分平队史生涯纪录 生死时刻连拿13分索命