Передача типа данных в хранилище и использование типа в асинхронной задаче

1

Я уверен, что возможно вернуть объекты репозитория из разных типов данных. У нас есть собственный 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;
        }          
    }
Теги:
repository-pattern
task
.net-4.5

1 ответ

0
Лучший ответ

Вы можете использовать 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);
    }
}
  • 0
    Спасибо, я думаю, что часть моего образования отсутствует Generics. Я обновлю свой код
  • 0
    Я надеялся на более простой ответ на самом деле, просто сосредоточился на передаче типа. Тем не менее, ваш ответ полезен тем, что охватывает весь проект, включая прохождение Type. Так что спасибо тебе!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню