簡體   English   中英

實體框架依賴注入

[英]Entity Framework Dependency Injection

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

我想更改DbSetFinder的行為, 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<>DbContext但不會發現成員,這是從繼承DbSet<> 這意味着我必須使用Type.IsAssignableFrom(Type)方法擴展代碼,以便查找繼承的實例。

我想用我的DbSetFinder類覆蓋默認的IDbSetFinderDbSetFinder為它提供了功能。 只是我不知道我在哪里可以做到這一點,我什么時候能做到這一點。

有一個ServiceProvider,可能會改變實現,但我不知道該怎么做。

有一個類,其中設置了核心服務依賴項:

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

如何在填充默認值之前聯系此服務提供商,以及如何更改其實施。

最簡單(也可能是公開的)方法是覆蓋OnConfiguring並使用DbContextOptionsBuilder.ReplaceService方法:

用不同的實現替換服務契約的內部實體框架實現。

例如

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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