Методы расширений не входят в тип, это C# syntactic sugar. Когда вы делаете:
myContext.ExtensionMethod();
компилятор сгенерирует следующий код:
ExtensionContainer.ExtensionMethod(myContext);
Где ExtensionContainer
определяется так:
public static class ExtensionContainer
{
public static void ExtensionMethod(this DbContext context)
{ }
}
При использовании метода расширения, компилятор будет вызвать статический метод. См. Extension Methods (C# Programming Guide) для получения дополнительной информации.
Вы не можете использовать метод расширения в вашем случае, поскольку context
больше не DbContext
но IMyContext
и методы расширения определяются для DbContext
не для IMyContext
.
Если вы хотите использовать эти методы расширения, одним из возможных решений является их добавление в ваш интерфейс.
public interface IMyContext
{
T UpdateGraph<T>(T entity, Expression<Func<IUpdateConfiguration<T>, object>> mapping, UpdateParams updateParams = null) where T : class
// other methods/properties
}
И в вашем конкретном контексте вам будет разрешено использовать метод расширения
public class MyContext : DbContext, IMyContext
{
public T UpdateGraph<T>(T entity, Expression<Func<IUpdateConfiguration<T>, object>> mapping, UpdateParams updateParams = null) where T : class
{
DbContextExtensions.UpdateGraph<T>(this, entity, mapping, updateParams);
}
}
Другое решение не полагаться больше на IMyContext
но инъекционного MyContext
. Это решение сделает ваше приложение более сложным для тестирования и обеспечит сильную зависимость от Entity Framework.
Кстати, это может сломаться Single Responsibility Principle, но я не вижу простой способ решить эту проблему без большого рефакторинга.
Были ли методы расширения в прошлом? – jjj
Это пакет Nuget, который предлагает методы расширения. Мой контекст реализует интерфейс, поэтому я могу использовать Ioc на нем. Теперь проблема в том, как я могу узнать свой интерфейс – InTheWorldOfCodingApplications