c# – 特定子类型不需要的工厂CreateInstance参数方法
我有一个工厂类和CreateInstance方法
CreateInstance(EntityModel.TipoEntitaTipoParametroEntita tipoParametroEntita,IParametroEntitaMultiValoreDataSourceProvider parametroEntitaMultiValoreDataSourceProvider) 工厂可以根据tipoParametroEntita.TipoCampo.IdTipoCampo的值实例化两个不同的子类型 要点是CreateInstance的第二个参数(parametroEntitaMultiValoreDataSourceProvider)仅用于创建TipoEntitaTipoParametroEntitaMultiValore的实例 public class TipoEntitaTipoParametroEntitaFactory : ITipoEntitaTipoParametroEntitaFactory { /// <summary> /// Creates an instance of TipoEntitaTipoParametroEntitaSingoloValore or TipoEntitaTipoParametroEntitaMultiValore /// </summary> public TipoEntitaTipoParametroEntita CreateInstance(EntityModel.TipoEntitaTipoParametroEntita tipoParametroEntita,IParametroEntitaMultiValoreDataSourceProvider parametroEntitaMultiValoreDataSourceProvider) { if (tipoParametroEntita.TipoCampo.IdTipoCampo == (int)EntityModel.Enum.TipoCampo.CampoLibero || tipoParametroEntita.TipoCampo.IdTipoCampo == (int)EntityModel.Enum.TipoCampo.CampoLiberoMultiLinea) { return new TipoEntitaTipoParametroEntitaSingoloValore(tipoParametroEntita); } if (tipoParametroEntita.TipoCampo.IdTipoCampo == (int)EntityModel.Enum.TipoCampo.DropdownListQueryDataSource || tipoParametroEntita.TipoCampo.IdTipoCampo == (int)EntityModel.Enum.TipoCampo.DropdownListTableDataSource) { return new TipoEntitaTipoParametroEntitaMultiValore(tipoParametroEntita,parametroEntitaMultiValoreDataSourceProvider); } return null; } } 我对这个采用的模式感到怀疑,因为我总是需要传递IParametroEntitaMultiValoreDataSourceProvider的实例,即使没有必要,而且读取方法签名的人可能会认为创建任何类型的TipoEntitaTipoParametroEntita,IParametroEntitaMultiValoreDataSourceProvider的实例是需要. 什么是更好的方法?两个不同的工厂?只有一个工厂和两个CreateInstance(一个返回TipoEntitaTipoParametroEntitaSingoloValore和另一个TipoEntitaTipoParametroEntitaMultiValore)? 我这两种情况我都应该知道哪个工厂或哪个CreateInstance要调用,所以我应该每次都提前检查tipoParametroEntita.TipoCampo.IdTipoCampo.但是我想把这个逻辑保留在一个地方. 解决方法
从功能编程的角度来看,我在处理所谓的“代数数据类型”即不同的子类型时会使用查看访问者模式.无论如何,我并不总是喜欢这种方法,因为它在开始时可能很难.
因此,我只给出基本的想法,以便您可以快速决定是否感兴趣.另请注意,此处的目标是编写具有函数签名的代码,以便在编译时可以发现错误,与运行时相反. 简而言之,通过利用C#语言类型检查功能,实现此目的的经典方法是定义一个新的访问者,包括带有签名的CreateInstance的所有不同覆盖: public IEntitaTipoParametroEntita CreateInstance(SubType1 subType1) { // ... } public IEntitaTipoParametroEntita CreateInstance(SubType2 subType2) { // ... } 每个子类型应该有自己的子类型 IEntitaTipoParametroEntita accept(CreateVisitor visitor) { visitor.CreateInstance(this); } 因此,您可以避免if和切换以及类似的容易出错的子类型检查语法,并简单地实例化特定的访问者,并将其传递给任何要处理的子类型. 数据库表 如果子类型之间存在显着的共性,那么将子类型拆分为单独的物理表可能没什么价值. 因此,就数据库设计而言,“每个层次结构的表”(利用类型鉴别器列来保存类型信息)似乎更适合您的示例:它通过非规范化SQL模式来实现多态性.为了指示Entity Framework使用此策略,所需的只是从DbContext类派生一个类,并为超类型添加DBSet属性,同时不为子类型添加DBSet属性. 阅读链接 > The Visitor Pattern – A Better Implementation (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |