Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 这是a';好';数据访问模式,它叫什么?_C#_Design Patterns - Fatal编程技术网

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个枚举中的一个,所以我想确保它一旦设置就不会更改。这里肯定有单身汉的一些方面,但这只是事情的实例方面。而且它不是严格意义上的正确单例,因为它不是线程安全的。