繁体   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