C# - 这是一个“好”的数据访问模式,它叫什么?

时间:2009-10-27 13:50:52

标签: c# design-patterns

首先,我为问题标题的含糊不清而道歉,如果已经在别处问过这个问题。我很难找到一个类似的答案,因为其他“这种模式称为'问题的数量。”

我有以下抽象类:

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.");
        }
    }

}

然后我得到了这个类的具体实现:

public class SqlPositionProvider<T> 
    : PositionProvider<T> where T : IPositionEntity
{
    public override List<T> GetList()
    {
        int positionTypeId = (int)this.PositionType;
        // Return the matching items here
    }
}

然后由许多不同的“项目”类使用,例如以下内容,但用SiteEntity / MajorEntity / MinorEntity替换CustomerEntity:

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,SiteProvider和etcProvider都只是持有PositionProvider类的特定实例。它们之间的唯一区别是实体类型和RP_PositionType枚举。这样我就可以在GetList()中使用相同的Sql具体实现,根据PositionType(枚举转换为int值时的PositionTypeId)从特定表中撤回所有记录。

3 个答案:

答案 0 :(得分:2)

我会说这看起来像Factory pattern。至少是DalHelper.CreateInstance部分。

答案 1 :(得分:2)

那是Abstract Factory Pattern。是的,它是一种有用且广泛使用的设计模式。

答案 2 :(得分:0)

这实际上是我认为的Singleton模式。另外,为什么要为PositionType做一个明确的'set'语句?

你最好在属性中使用'set'而不是函数,对于使用该类的开发人员来说更清楚。