#c# #api #task #.net-4.5 #repository-pattern
#c# #API #задача #.net-4.5 #репозиторий-шаблон
Вопрос:
Я уверен, что возможно, чтобы репозиторий возвращал объекты различных типов данных. У нас есть собственный 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=Falseamp;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 "amp;page=" page "amp;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;
}
}
Ответ №1:
Вы можете использовать Generic и создать репозиторий. Просто фрагмент с использованием entity framework, вы можете использовать его в своем 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);
}
}
Комментарии:
1. Спасибо, я думаю, что часть, которой не хватает моему образованию, — это общие сведения. Я обновлю свой код.
2. На самом деле я надеялся на более простой ответ, просто сосредоточился на передаче типа. Однако ваш ответ полезен тем, что он охватывает весь проект, включая передачу типа. Так что спасибо вам!