У меня возникла небольшая проблема с моим уровнем доступа к данным. В данном конкретном случае у меня есть таблица, которая содержит потенциально 5 типов «сущностей». В основном это Company, Customer, Site и т. Д. Тип определяется значением PositionTypeId в таблице. Все они находятся в одной таблице, поскольку имеют одинаковую структуру данных; PositionId, описание и код .
У меня есть основной абстрактный класс следующим образом:
public abstract class PositionProvider<T> : DalProvider<T>, IDalProvider where T : IPositionEntity
{
public static PositionProvider<T> Instance
{
get
{
if (_instance == null)
{
// Create an instance based on the current database type
}
return _instance;
}
}
private static PositionProvider<T> _instance;
public PositionType PositionType
{
get
{
return _positionType;
}
}
private PositionType _positionType;
// Gets a list of entities based on the PositionType enum's value.
public abstract List<T> GetList();
internal void SetPositionType(RP_PositionType positionType)
{
_positionType = positionType;
}
}
Я хочу иметь возможность поместить весь общий код в класс наследования, основанный на SQL или Oracle. Это моя реализация SQL:
public class SqlPositionProvider<T> : PositionProvider<T> where T : IPositionEntity
{
public override List<T> GetList()
{
int positionTypeId = (int)this.PositionType;
using (SqlConnection cn = new SqlConnection(Globals.Instance.ConnectionString))
{
SqlCommand cmd = new SqlCommand("Get_PositionListByPositionTypeId", cn);
cmd.Parameters.Add("@PositionTypeId", SqlDbType.Int).Value = positionTypeId;
cmd.CommandType = CommandType.StoredProcedure;
cn.Open();
return this.GetCollectionFromReader(this.ExecuteReader(cmd));
}
}
}
Затем я создал класс для каждого типа следующим образом (это, например, CustomerProvider):
public class CustomerProvider
{
public static PositionProvider<CustomerEntity> Instance
{
get
{
if ((int)PositionProvider<CustomerEntity>.Instance.PositionType == 0)
{
PositionProvider<CustomerEntity>.Instance.SetPositionType(PositionType.Customer);
}
return PositionProvider<CustomerEntity>.Instance;
}
}
}
Это все работает фантастически ... пока я не понял, что у меня есть определенные функции, которые конкретно связаны с определенными типами позиций. То есть Мне нужно иметь возможность получать всех клиентов (это IPositionType) на основе разрешений пользователей.
Так что мне нужно добавить еще один абстрактный метод:
public abstract List<CustomerEntity> GetCustomersByUserPermission(Guid userId);
Теперь, очевидно, я не хочу, чтобы это было в моем абстрактном классе PositionProvider, поскольку это означало бы, что этот метод появится при работе с поставщиком сайта / компании.
Как добавить этот и другие дополнительные методы, не дублируя код в SqlPositionProvider?
Изменить:
Единственная идея, с которой я столкнулся, - это разделить PositionProvider на общее свойство CustomerProvider, SiteProvider и т.д.Provider:
public abstract class CustomerProvider
{
public CustomerProvider()
{
this.Common.SetPositionType(PositionType.Customer);
}
public PositionProvider<CustomerEntity> Common
{
get
{
if (_common == null)
{
DalHelper.CreateInstance<PositionProvider<CustomerEntity>>(out _common);
}
return _common;
}
}
private PositionProvider<CustomerEntity> _common;
public static CustomerProvider Instance
{
get
{
if (_instance == null)
{
DalHelper.CreateInstance<CustomerProvider>(out _instance);
}
return _instance;
}
}
private static CustomerProvider _instance;
public abstract List<CustomerEntity> GetCustomersByUserPermission(Guid userId);
}
Это позволило бы мне поместить конкретный код в CustomerProvider.Instance.MyNonGenericMethod()
, а затем получить доступ к PositionProvider
. Я мог бы сделать CustomerProvider.Instance.Common.GetList()
... Хотя это выглядит как взлом.