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

时间:2015-05-18 20:35:03

标签: entity-framework autofac graphdiff

我正在使用第三方库 GraphDiff ,它将扩展方法添加到DBContext类。我的Context类继承自Interface,如下面的

 MyContext: DbContext,IMyContext 

IoC包含注册MyContext作为IMyContext。界面没有扩展方法的签名和第三个。现在我没有得到MyContext将如何使用该扩展方法?如果我创建了MyContext的Object,它就有了这个方法但是当它被Inject它没有

1 个答案:

答案 0 :(得分:5)

扩展方法不属于该类型,它是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 {1}}。

如果您想使用这些扩展方法,一种可能的解决方案是将它们添加到您的界面。

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。此解决方案将使您的应用程序更难以测试,并将与实体框架引入强大的依赖关系。

顺便这样做可能会破坏Single Responsibility Principle,但我没有看到一个简单的方法来解决这个问题,而不需要进行大的重构。