gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 08:31:21 25 4
gpt4 key购买 nike

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

 MyContext: DbContext,IMyContext 

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

最佳答案

扩展方法不是类型的一部分,它是 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,而是注入(inject)MyContext。此解决方案将使您的应用程序更难测试,并且会引入对 Entity Framework 的强烈依赖。

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

关于entity-framework - 使用 AutoFac 解析具有扩展方法的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30312367/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com