2015-05-18 2 views
2

Я использую стороннюю библиотеку GraphDiff, которая добавляет методы расширения к классу DBContext. Класс My Context наследуется от интерфейса, например, следующим образом:Устранение класса с методами расширения с помощью AutoFac

MyContext: DbContext,IMyContext 

IoC содержит регистр MyContext как IMyContext. Интерфейс не имеет подписи подписи и третьего. Теперь я не понимаю, как MyContext будет иметь этот метод расширения? Если я создаю объект MyContext, у него есть этот метод, но когда он получает Inject, то он не

+0

Были ли методы расширения в прошлом? – jjj

+0

Это пакет Nuget, который предлагает методы расширения. Мой контекст реализует интерфейс, поэтому я могу использовать Ioc на нем. Теперь проблема в том, как я могу узнать свой интерфейс – InTheWorldOfCodingApplications

ответ

4

Методы расширений не входят в тип, это 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, но я не вижу простой способ решить эту проблему без большого рефакторинга.

+0

Что делать, если я вставляю MyContext и избавляюсь от IMyContext? – InTheWorldOfCodingApplications

+0

Это будет работать, но тест будет сложнее, и ваше приложение будет тесно связано с * Entity Framework * –

+0

public static T UpdateGraph (этот контекст DbContext, объект T, выражение , объект >> сопоставление, обновление обновлений обновленийParams = null) где T: class // Это сигнатура метода расширения, которым я пользуюсь.Как это можно добавить к IMyContext – InTheWorldOfCodingApplications

 Смежные вопросы

  • Нет связанных вопросов^_^