![](/img/trans.png)
[英]Extension methods of Entity Framework in unit test using Moq and Autofac
[英]Resolving class that has extension methods with AutoFac
我正在使用第三方库GraphDiff ,该库将Extension方法添加到DBContext类。 我的Context类是从Interface继承的,如下所示
MyContext: DbContext,IMyContext
IoC包含将MyContext注册为IMyContext。 接口没有扩展方法的签名和第三位。 现在我不明白MyContext如何拥有该扩展方法? 如果我创建MyContext的对象,它具有该方法,但是当它被注入时,它没有
扩展方法不是该类型的一部分,它是C# 语法糖 。 当您这样做时:
myContext.ExtensionMethod();
编译器将生成以下代码:
ExtensionContainer.ExtensionMethod(myContext);
其中ExtensionContainer
的定义如下:
public static class ExtensionContainer
{
public static void ExtensionMethod(this DbContext context)
{ }
}
当您使用扩展方法时,编译器将调用静态方法。 有关更多信息,请参见扩展方法(C#编程指南) 。
在这种情况下,不能使用扩展方法,因为context
不再是DbContext
而是IMyContext
和扩展方法是为DbContext
定义的, 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引入强大的依赖关系。
顺便说一句,这样做可能会违反“ 单一责任原则”,但我认为如果不进行大量重构,就不会找到解决此问题的简便方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.