C# 这是a';好';数据访问模式,它叫什么?
首先,我为问题标题的模糊性道歉,如果其他地方已经有人问过这个问题。我很难找到一个类似的答案,因为还有很多其他的“这个模式叫什么”的问题 我有以下抽象类:C# 这是a';好';数据访问模式,它叫什么?,c#,design-patterns,C#,Design Patterns,首先,我为问题标题的模糊性道歉,如果其他地方已经有人问过这个问题。我很难找到一个类似的答案,因为还有很多其他的“这个模式叫什么”的问题 我有以下抽象类: public abstract class PositionProvider<T> : DalProvider<T>, IDalProvider where T : IPositionEntity { protected PositionProvider() : base() { }
public abstract class PositionProvider<T> : DalProvider<T>, IDalProvider
where T : IPositionEntity
{
protected PositionProvider()
: base() { }
public RP_PositionType PositionType
{
get
{
return _positionType;
}
}
private RP_PositionType _positionType;
public abstract List<T> GetList();
internal void SetPositionType(RP_PositionType positionType)
{
if (_positionType == null)
{
_positionType = positionType;
}
else
{
throw new NotSupportedException(
"PositionType can only be set once.");
}
}
}
公共抽象类位置提供程序:DalProvider、IDalProvider
式中T:IPositionEntity
{
受保护的位置提供程序()
:base(){}
公共RP_位置类型位置类型
{
得到
{
返回位置类型;
}
}
专用RP_位置类型_位置类型;
公共摘要列表GetList();
内部空隙设置位置类型(RP\U位置类型位置类型)
{
如果(_positionType==null)
{
_位置类型=位置类型;
}
其他的
{
抛出新的NotSupportedException(
“PositionType只能设置一次。”);
}
}
}
然后我得到了这个类的一个具体实现:
public class SqlPositionProvider<T>
: PositionProvider<T> where T : IPositionEntity
{
public override List<T> GetList()
{
int positionTypeId = (int)this.PositionType;
// Return the matching items here
}
}
公共类SqlPositionProvider
:PositionProvider,其中T:IPositionEntity
{
公共覆盖列表GetList()
{
int positionTypeId=(int)this.PositionType;
//在此处返回匹配的项目
}
}
然后,许多不同的“项目”类别(如以下类别)利用了这一点,但将CustomerEntity替换为SiteEntity/MajorEntity/MinorEntity:
public class CustomerProvider
{
public static PositionProvider<CustomerEntity> Instance
{
get
{
if (_instance == null)
{
DalHelper.CreateInstance<PositionProvider<CustomerEntity>>(
out _instance);
_instance.SetPositionType(RP_PositionType.Customer);
}
return _instance;
}
}
private static PositionProvider<CustomerEntity> _instance;
}
公共类CustomerProvider
{
公共静态位置提供程序实例
{
得到
{
if(_instance==null)
{
DalHelper.CreateInstance(
例如,;
_实例.SetPositionType(RP_PositionType.Customer);
}
返回_实例;
}
}
私有静态位置提供者_实例;
}
CustomerProvider、SiteProvider和etcProvider都只包含PositionProvider类的特定实例。它们之间唯一的区别是实体类型和RP_PositionType枚举。因此,我可以在GetList()中使用相同的Sql具体实现,根据PositionType(当枚举转换为int值时,PositionTypeId)从特定表中提取所有记录。我认为这看起来像。至少,
DalHelper.CreateInstance
部分是。是的,它是一种有用且广泛使用的设计模式。这实际上是我相信的单例模式。另外,为什么要对PositionType执行显式的“set”语句
您最好在属性中使用“set”而不是函数,这对于使用该类的开发人员来说更清楚。我不希望在属性中使用set,因为我只希望它设置一次。因为它可能是5个枚举中的一个,所以我想确保它一旦设置就不会更改。这里肯定有单身汉的一些方面,但这只是事情的实例方面。而且它不是严格意义上的正确单例,因为它不是线程安全的。