我正在使用第三方库 GraphDiff ,它将扩展方法添加到DBContext类。我的Context类继承自Interface,如下面的
MyContext: DbContext,IMyContext
IoC包含注册MyContext作为IMyContext。界面没有扩展方法的签名和第三个。现在我没有得到MyContext将如何使用该扩展方法?如果我创建了MyContext的Object,它就有了这个方法但是当它被Inject它没有
时答案 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,但我没有看到一个简单的方法来解决这个问题,而不需要进行大的重构。