C # - это «хороший» шаблон доступа к данным и как он называется?

2

Прежде всего, я приношу свои извинения за неопределенность названия вопроса и если это уже было задано в другом месте. Я изо всех сил пытался найти подобный ответ из-за количества других вопросов "что такое шаблон, называемый".

У меня есть следующий абстрактный класс:

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
    }
}

Затем это используется несколькими различными классами "item", такими как следующие, но заменяя 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;

}

ClientProvider, SiteProvider, etcProvider - все просто содержат определенный экземпляр класса PositionProvider. Единственное различие между ними - тип сущности и перечисление RP_PositionType. Таким образом, я могу использовать ту же конкретную реализацию Sql в GetList(), чтобы отбросить все записи из конкретной таблицы на основе PositionType (PositionTypeId, когда перечисление преобразуется в значение int).

Теги:
design-patterns

3 ответа

2
Лучший ответ

Что Аннотация Factory Шаблон. И да, это полезный и широко используемый дизайн.

2

Я бы сказал, что это выглядит как Factory pattern. По крайней мере, часть DalHelper.CreateInstance.

0

На самом деле это шаблон Singleton, который я считаю. Кроме того, почему вы делаете явный оператор "set" для PositionType?

Вам лучше использовать "набор" в свойстве вместо функции, это намного понятнее для разработчиков, использующих класс.

  • 0
    Я не хотел, чтобы набор в моей собственности, потому что я только хочу, чтобы он был установлен один раз. Поскольку это может быть одно из 5 перечислений, я хочу убедиться, что оно никогда не изменяется после установки. Здесь определенно есть аспекты Singleton, но это только для примера. Кроме того, это не совсем правильный синглтон, так как он не безопасен для потоков.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню