我正在使用第三方库GraphDiff,它将扩展方法添加到 DBContext 类。我的 Context 类是从 Interface 继承的,如下所示
MyContext: DbContext,IMyContext
IoC 包含将 MyContext 注册为 IMyContext。接口没有扩展方法的签名和第三个。现在我不知道 MyContext 将如何拥有该扩展方法?如果我创建 MyContext 的对象,它具有该方法,但是当它获取 Inject 时却没有
我正在使用第三方库GraphDiff,它将扩展方法添加到 DBContext 类。我的 Context 类是从 Interface 继承的,如下所示
MyContext: DbContext,IMyContext
IoC 包含将 MyContext 注册为 IMyContext。接口没有扩展方法的签名和第三个。现在我不知道 MyContext 将如何拥有该扩展方法?如果我创建 MyContext 的对象,它具有该方法,但是当它获取 Inject 时却没有
扩展方法不是类型的一部分,它是 C#语法糖。当你这样做:
myContext.ExtensionMethod();
编译器将生成以下代码:
ExtensionContainer.ExtensionMethod(myContext);
WhereExtensionContainer
的定义如下:
public static class ExtensionContainer
{
public static void ExtensionMethod(this DbContext context)
{ }
}
当您使用扩展方法时,编译器将调用静态方法。有关详细信息,请参阅扩展方法(C# 编程指南)。
您不能在您的情况下使用扩展方法,因为context
不再是 a DbContext
butIMyContext
并且扩展方法是为DbContext
not 定义的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的强依赖关系。
顺便说一句,这样做可能会违反单一责任原则,但我看不出没有大重构的简单方法来解决这个问题。