[英]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.