Как создать библиотеку классов, которая может использовать любой Ef Core DbContext

Я пытаюсь создать библиотеку классов, которая может использовать DbContext, который сможет запрашивать сущности, имеющие общую схему. (это первый проект БД)

В моем проекте библиотеки классов есть следующее:

    public interface ITranslate
    {
        public long Id
        public long ParentId
        public long LangId
    }

В отдельном проекте у меня было бы следующее:

    public partial class SectionTranslation : ITranslate
    {
         public string SectionName { get; set; }
    {

И в другом проекте у меня может быть следующее

    public partial class TemplateTranslation : ITranslate
    {
         public string TemplateName { get; set; }
    {

Что я хотел бы сделать, так это сделать следующий контракт реальностью, однако я не уверен, как подойти к этому. Я хотел бы иметь возможность вернуть запись, которая будет соответствовать общему запросу в методе GetBestTranslation, я хотел бы вернуть объект SectionTranslation или TemplateTranslation в зависимости от того, какой проект использует библиотеку, а в методе SaveTranslation сохранить запись перевода.

    public interface ITranslateManager
    {
        Task<T> GetBestTranslationAsync(long langId);
        Task CreateTranslationAsync<T>(long langId)
    }

Всем заранее спасибо за помощь

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
2
0
47
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете просто получить доступ к своему dbContext, выполнив следующие действия:

protected readonly PostgisDbContext Context;

protected Service(PostgisDbContext context) : base(context)
{
    Context = context;
}

Использовать этот контекст довольно просто. Вы можете запросить набор данных в своем контексте, сопоставив Type, переданный в общую функцию, с существующей таблицей набора данных Type. Не забудьте добавить where : T : class Это сообщит функции, что универсальный TypeT назначается классом, который вы предоставляете в вызове.

public Task<T> GetAsync(long langId) where : T : class
{
    Context.Set<T>().Where(predicate).FirstOrDefault();
}

Если вам нужно, чтобы код был более динамичным, вы можете добавить предикат в качестве его параметра. Это позволит вам использовать разные запросы без необходимости создавать новую функцию. Например x => x == true.

public Task<T> Get(Func<T, bool> predicate) => Context.Set<T>().Where(predicate).FirstOrDefault();

Чтобы вызвать метод, вы должны сообщить функции, что такое общий Type. Вы делаете это так:

_translationService.GetAsync<MyClass>(parameter);
Ответ принят как подходящий

Вы можете использовать условие where в методе.

public class TranslateManager : ITranslateManager
{
    private readonly ContextDb _contextDb;

    public TranslateManager(ContextDb contextDb)
    {
        _contextDb = contextDb;
    }

    public async Task CreateTranslationAsync<T>(long langId) where T : class, ITranslate
    {
        // ToDo
    }

    public async Task<ITranslate> GetBestTranslationAsync<T>(long langId) where T : class, ITranslate
    {
        var dbSet = _contextDb.GetDbSet<T>();
        return await dbSet.Where(x => x.LangId == langId).FirstOrDefaultAsync();
    }
}

public interface ITranslate
{
    public long Id { get; set; }
    public long ParentId { get; set; }
    public long LangId { get; set; }
}

public partial class SectionTranslation : ITranslate
{
    public long Id { get; set; }
    public long ParentId { get; set; }
    public long LangId { get; set; }
    public string SectionName { get; set; }
}

public partial class TemplateTranslation : ITranslate
{
    public long Id { get; set; }
    public long ParentId { get; set; }
    public long LangId { get; set; }
    public string TemplateName { get; set; }
}

public interface ITranslateManager
{
    Task<T> GetBestTranslationAsync<T>(long langId) where T : class, ITranslate;
    Task CreateTranslationAsync<T>(long langId) where T : class, ITranslate;
}

Другие вопросы по теме