使用 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,但我没有看到无需大量重构即可解决此问题的简单方法。
我正在使用第三方库 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,但我没有看到无需大量重构即可解决此问题的简单方法。