Использование ApplicationDbContext в методе расширения - PullRequest
0 голосов
/ 23 января 2019

В настоящее время я работаю над приложением ASP.NET Core для внутреннего использования.Это приложение должно перечислить даты и в зависимости от даты, некоторые операции разрешены, а другие нет.Я прекрасно могу использовать представления скаффолдов, и они точно отображают то, что я хочу, с одним исключением: если операция не разрешена, я хочу отображать их серым цветом.

Моя идея состояла в том, чтобы добавить метод расширения с именем IsSpecialOperationPermitted к DateTimeпоэтому я могу легко использовать dateTimeInstance.IsSpecialOperationPermitted.

Метод "IsSpecialOperationPermitted" зависит от некоторых вычислений и другой таблицы в базе данных.Теперь, чтобы использовать мой метод расширения, я хотел бы получить доступ к этой таблице.Обычно я создаю экземпляр ApplicationDbContext и запрашиваю эту таблицу.

Для ASP.NET Core я чувствую, что это неправильный подход, но мне следует запросить уже существующий ApplicationDbContext.Обычно этот ApplicationDbContext вводится более или менее автоматически, но у меня нет ApplicationDbContext в моем методе расширения.

Каков будет «правильный» способ запроса ApplicationDbContext в моем методе расширения?

1 Ответ

0 голосов
/ 23 января 2019

Вы пытаетесь построить абстракцию над типом DateTime, что совершенно нормально.Однако, если вам требуется контекст db для выполнения вашей операции, вы должны явно принять DbContext в качестве аргумента, чтобы указать, что ваш метод должен хотя бы прочитать его.

Вы можете написать что-то вроде этого

public static class DateTimeExtensions
{
    public static bool IsSpecialOperationPermitted(this DateTime value, ApplicationDbContext context)
    {
        // do here your computation
    }
}

С другой стороны, вы можете повернуть его вспять и расширить DbContext:

public static class DbContentExtensions
{
    public static bool IsSpecialOperationPermitted(this ApplicationDbContext context, DateTime value)
    {
        // do here your computation
    }
}

Последнее, на мой взгляд, более понятно.

Сохранитьпомните, что методы расширения предназначены для работы с документированными побочными эффектами, а некоторые операции, которые теоретически могут быть «хорошими» в качестве методов расширения, могут в конечном итоге привести к слишком загадочным последствиям.

Кроме того, вы должны знатьчто если вызывающий имеет ожидающие изменения контекста, ваш метод не увидит их, пока вы не проверите свойство Local.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...