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

#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. На самом деле я надеялся на более простой ответ, просто сосредоточился на передаче типа. Однако ваш ответ полезен тем, что он охватывает весь проект, включая передачу типа. Так что спасибо вам!