实体框架依赖注入

时间:2019-01-05 13:43:29

标签: c# entity-framework entity-framework-core

我想知道,依赖注入在EFCore中是如何工作的。

我想更改DbSetFinder的行为以不仅找到DbSet<>DbQuery<>成员,还要找到从其继承的成员。

当前代码如下:

    private static DbSetProperty[] FindSets(Type contextType)
    {
        var factory = new ClrPropertySetterFactory();

        return contextType.GetRuntimeProperties()
            .Where(
                p => !p.IsStatic()
                     && !p.GetIndexParameters().Any()
                     && p.DeclaringType != typeof(DbContext)
                     && p.PropertyType.GetTypeInfo().IsGenericType
                     && (p.PropertyType.GetGenericTypeDefinition() == typeof(DbSet<>)
                         || p.PropertyType.GetGenericTypeDefinition() == typeof(DbQuery<>)))
            .OrderBy(p => p.Name)
            .Select(
                p => new DbSetProperty(
                    p.Name,
                    p.PropertyType.GetTypeInfo().GenericTypeArguments.Single(),
                    p.SetMethod == null ? null : factory.Create(p),
                    p.PropertyType.GetGenericTypeDefinition() == typeof(DbQuery<>)))
            .ToArray();
    }

DbSet<>的{​​{1}}中找到了此代码,但没有找到从DbContext继承来的成员。 这意味着我必须使用DbSet<>方法扩展代码,以查找继承的实例。

我想用我的Type.IsAssignableFrom(Type)类在默认的IDbSetFinder中覆盖,EFCore为它提供了功能。只是我不知道该在哪里做,什么时候可以做。

有一个ServiceProvider,可以更改实现,但是我不知道该怎么做。

有些类设置了核心服务依赖项:

DbSetFinder
  

如何在此服务提供商填入默认值之前联系我,以及如何更改其实现。

1 个答案:

答案 0 :(得分:4)

最简单(并且可能打算公开)的方法是覆盖OnConfiguring并使用DbContextOptionsBuilder.ReplaceService方法:

  

将服务合同的内部Entity Framework实现替换为其他实现。

例如

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder.ReplaceService<IDbSetFinder, CustomDbSetFinder>();
    // ...
}