2

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

 MyContext: DbContext,IMyContext 

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

4

1 回答 1

6

扩展方法不是类型的一部分,它是 C#语法糖。当你这样做:

myContext.ExtensionMethod(); 

编译器将生成以下代码:

ExtensionContainer.ExtensionMethod(myContext); 

WhereExtensionContainer的定义如下:

public static class ExtensionContainer 
{
    public static void ExtensionMethod(this DbContext context)
    { }
}

当您使用扩展方法时,编译器将调用静态方法。有关详细信息,请参阅扩展方法(C# 编程指南)

您不能在您的情况下使用扩展方法,因为context不再是 a DbContextbutIMyContext并且扩展方法是为DbContextnot 定义的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的强依赖关系。

顺便说一句,这样做可能会违反单一责任原则,但我看不出没有大重构的简单方法来解决这个问题。

于 2015-05-19T09:30:40.037 回答