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

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

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

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;

}

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

Ответы [ 3 ]

2 голосов
/ 27 октября 2009

Это Абстрактный шаблон фабрики . И да, это полезный и широко используемый шаблон проектирования.

2 голосов
/ 27 октября 2009

Я бы сказал, что это похоже на шаблон Factory . По крайней мере, DalHelper.CreateInstance часть.

0 голосов
/ 27 октября 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...