簡體   English   中英

使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM