使用 AutoFac 解析具有扩展方法的 class

Resolving class that has extension methods with AutoFac

我正在使用第三方库 GraphDiff,它将扩展方法添加到 DBContext class。我的上下文 class 继承自接口,如下所示

 MyContext: DbContext,IMyContext 

IoC 包含将 MyContext 注册为 IMyContext。接口没有扩展方法的签名和第三个。现在我不知道 MyContext 将如何拥有该扩展方法?如果我创建 MyContext 的对象它有那个方法但是当它得到注入时它没有

扩展方法不是类型的一部分,它是 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,但我没有看到无需大量重构即可解决此问题的简单方法。