实体框架依赖注入

Gyö*_*yás 3 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();
    }
Run Code Online (Sandbox Code Playgroud)

DbSet<>中找到了该代码,DbContext但未从中继承成员DbSet<>。这意味着我必须使用Type.IsAssignableFrom(Type)方法扩展代码,以查找继承的实例。

我想IDbSetFinder用我的DbSetFinder类覆盖默认值,EFCore为它提供了功能。只是我不知道该在哪里,什么时候该做。

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

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

    public virtual EntityFrameworkServicesBuilder TryAddCoreServices()
    {
        TryAdd<IDbSetFinder, DbSetFinder>();
        TryAdd<IDbSetInitializer, DbSetInitializer>();
        TryAdd<IDbSetSource, DbSetSource>();
        TryAdd<IDbQuerySource, DbSetSource>();
        ...
Run Code Online (Sandbox Code Playgroud)

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

Iva*_*oev 6

最简单的(并且可能是预期的公开)方法是重写OnConfiguring和使用DbContextOptionsBuilder.ReplaceService方法:

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

例如

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder.ReplaceService<IDbSetFinder, CustomDbSetFinder>();
    // ...
}
Run Code Online (Sandbox Code Playgroud)