Я уверен, что возможно вернуть объекты репозитория из разных типов данных. У нас есть собственный API, который возвращает результаты тестов студентов для различных типов тестов. Мое задание состоит в том, чтобы получить эти оценки, преобразовать их в стандартную модель и затем импортировать оценки в студенческую информационную систему (используя другой API). В настоящее время я работаю над импортом баллов. Мой план состоит в том, чтобы иметь процессор для каждого типа теста, который будет импортировать, преобразовывать и загружать оценки. Существует репозиторий, который вытаскивает оценки из API и возвращает их в процессор. Ниже у меня есть рабочий код, который делает это для оценок чтения. Но у меня также есть 4 других типа баллов, каждый из которых имеет немного другую модель и в конечном итоге может иметь больше.
Ниже приведен код, который работает для оценок чтения, мой вопрос: как я могу повторно использовать этот репозиторий для возврата моделей с разной оценкой без написания задачи для каждого типа оценки?
Вот что я ДУМАЮ, что догадался. Процессор должен передавать только тот тип оценки, который я хочу, а не конкретный URL (как мой код в настоящее время делает, нарушая шаблон репозиции), что-то вроде:
var data = _assessmentAPIRepository.GetScores(Reading);
И интерфейс должен получать тип, что-то вроде...
public interface IAssessmentApiRepository<T>
Но я не знаю, куда идти оттуда. Могу ли я получить какое-то направление? Псевдокод отлично, но мне действительно нужны ключевые слова и ссылки на учебные пособия. У меня есть учет Pluralsight, поэтому, если вы знаете что-то там, что поможет мне сообщить. Я не возражаю против учебы, но время - это импорт, поэтому я не хочу спускаться с кроличьей дыры.
Рабочий код: процессор для типа оценки чтения:
public override IEnumerable Load(ScheduledTask task)
{
var dateFromConfig = _assessmentApiRepository.GetBaseCutoffDate();
string scoresURL = "Reading/scores?includeStrands=False&updatedSince=" + dateFromConfig.ToString("MM/dd/yyyy");
var data = _assessmentApiRepository.GetScores(scoresURL);
return data;
}
Интерфейс:
public interface IAssessmentApiRepository
{
IEnumerable<ReadingCompositeScoreModel<ReadingStrandScoreModel>> GetScores(string url);
}
Репозиторий:
public class AssessmentApiRepository : IAssessmentApiRepository
{
protected AssessmentsApiConfig _api;
public AssessmentApiRepository(AssessmentsApiConfig api)
{
_api = api;
}
public IEnumerable<ReadingCompositeScoreModel<ReadingStrandScoreModel>> GetScores(string BaseURL)
{
var scores = new List<ReadingCompositeScoreModel<ReadingStrandScoreModel>>();
int totalCount = 1;
int currentCount = 0;
int page = 1;
int pageSize = 5000;
using (var client = new HttpClient())
{
while (totalCount > currentCount)
{
string baseAddress = _api.BaseUrl;
string url = BaseURL + "&page=" + page + "&pageSize=" + pageSize;
Task<PagedListModel<ReadingCompositeScoreModel<ReadingStrandScoreModel>>> task = RunAsync(baseAddress, url);
foreach (var score in task.Result.Items)
{
scores.Add(score);
}
totalCount = task.Result.TotalCount;
currentCount = currentCount + task.Result.Count;
page++;
}
return scores;
}
}
static async Task<PagedListModel<ReadingCompositeScoreModel<ReadingStrandScoreModel>>> RunAsync(string baseAddress, string parameter)
{
var response = new PagedListModel<ReadingCompositeScoreModel<ReadingStrandScoreModel>>();
var handler = new HttpClientHandler
{
UseDefaultCredentials = true
};
using (var client = new HttpClient(handler))
{
client.BaseAddress = new Uri(baseAddress);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage httpResponse = await client.GetAsync(parameter);
if (httpResponse.IsSuccessStatusCode)
{
response = await httpResponse.Content.ReadAsAsync<PagedListModel<ReadingCompositeScoreModel<ReadingStrandScoreModel>>>();
}
return response;
}
}
Вы можете использовать Generic и создать репозиторий. Просто фрагмент, использующий структуру сущностей, вы можете использовать его в своем scenerio
public interface IRepository<TEntity,TKey> where TEntity : class
{
IEnumerable<TEntity> Get(Expression<Func<TEntity, bool>> filter = null,
Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
string includeProperties = "");
TEntity GetById(TKey id);
void Insert(TEntity entityToAdd);
void Update(TEntity entityToUpdate);
void Delete(TKey id);
}
public class GenericRepository<TEntity, TKey> : IRepository<TEntity, TKey> where TEntity : class
{
//Set the variables here
internal UsersContext context;
internal DbSet<TEntity> dbSet;
//Prepare the enviroment here
public GenericRepository(UsersContext context)
{
this.context = context;
this.dbSet = context.Set<TEntity>();
}
/// <summary>
/// To get all the records
/// </summary>
/// <param name="filter">Get the filter expression</param>
/// <param name="orderBy">Get the order by parameters</param>
/// <param name="includeProperties">Get the include properties</param>
/// <returns>return the list of records</returns>
public IEnumerable<TEntity> Get(System.Linq.Expressions.Expression<Func<TEntity, bool>> filter = null, Func<IQueryable<TEntity>,
IOrderedQueryable<TEntity>> orderBy = null, string includeProperties = "")
{
IQueryable<TEntity> query = dbSet;
if (filter != null)
{
query = query.Where(filter);
}
foreach (var includeProperty in includeProperties.Split
(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
{
query = query.Include(includeProperty);
}
if (orderBy != null)
{
query = orderBy(query);
}
return query.ToList();
}
/// <summary>
/// Get the entity by id
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public TEntity GetById(TKey id)
{
return dbSet.Find(id);
}
/// <summary>
/// Insert the record
/// </summary>
/// <param name="entityToAdd">Get the entity to insert</param>
public void Insert(TEntity entityToAdd)
{
dbSet.Add(entityToAdd);
}
/// <summary>
/// Update the record
/// </summary>
/// <param name="entityToUpdate">Get the entity to update</param>
public void Update(TEntity entityToUpdate)
{
dbSet.Attach(entityToUpdate);
context.Entry(entityToUpdate).State = EntityState.Modified;
}
/// <summary>
/// Delete the entity
/// </summary>
/// <param name="id">Get the id to delete</param>
public void Delete(TKey id)
{
TEntity entityToDelete = dbSet.Find(id);
if (context.Entry(entityToDelete).State == EntityState.Detached)
{
dbSet.Attach(entityToDelete);
}
dbSet.Remove(entityToDelete);
}
}