Если бы я был вами, я бы создал абстрактный базовый класс, имеющий общий метод GetAll, подобный этому ...
public abstract class DataAccessBase<T> where T : VehicleBase
{
public virtual T GetAll(short masterId, DateTime startDate, short gbuId)
{
...
}
}
Затем вы можете создать конкретные реализации этого ..
public class CarDataAccess : DataAccessBase<Car>
{
public override Car GetAll(short masterId, DateTime startDate, short gbuId)
{
...
}
}
public class VanDataAccess : DataAccessBase<Van>
{
public override Van GetAll(short masterId, DateTime startDate, short gbuId)
{
...
}
}
В базовый класс вы можете поместить все поведение, общее для всего, затем в переопределяющие методы вы можете поместить все, что специфично для конкретного типа, с которым вы имеете дело.
Вместо использования автомобилей и микроавтобусов ниже приведен пример, более специфичный для вашего кода.
public abstract class DataAccessBase<T>
{
public virtual IEnumerable<T> GetAll(short masterId, DateTime startDate, short gbuId)
{
var cacheKey = this.Cache.CreateCacheKey(this, masterId, startDate, gbuId);
List<T> result = this.Cache.GetList<T>(cacheKey);
if (result != null) return result;
lock (LockObject)
{
result = this.Cache.GetList<T>(cacheKey);
if (result != null) return result;
using (var dataContext = OscaDataContext.CreateWithCustomTimeOut())
{
result = this.GetResult(dataContext, masterId, startDate, gbuId);
this.Cache.Add(cacheKey, result);
}
}
return result;
}
protected abstract List<T> GetResult(var dataContext, short masterId, DateTime startDate, short gbuId);
}
public class HierarchyDivisionDailyResultDataAccess : DataAccessBase<IHierarchyDivisionDailyResult>
{
public virtual IEnumerable<IHierarchyDivisionDailyResult> GetAll(short masterId, DateTime startDate, short gbuId)
{
return base.GetAll(masterId, startDate, gbuId);
}
protected override List<IHierarchyDivisionDailyResult> GetResult(var dataContext, short masterId, DateTime startDate, short gbuId)
{
return dataContext.HierarchyDivisionDaily(masterId, startDate, gbuId).ToList();
}
}