Можно ли передать T как DbContext в метод расширения IServiceCollection? - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть следующее:

 public static IServiceCollection AddCustomDbContext<T>(this IServiceCollection services, IConfiguration configuration)
    {
        var typeInfo = typeof(T).GetTypeInfo();
        services.AddEntityFrameworkSqlServer()
            .AddDbContext<T>(options =>
            {
                options
                .UseSqlServer(configuration["ConnectionString"],
                        sqlOptions =>
                        {
                            sqlOptions.MigrationsAssembly(typeInfo.Assembly.GetName()                                    .Name);
                            sqlOptions.EnableRetryOnFailure(10, TimeSpan.FromSeconds(30), null);
                        });
            });

        return services;
    }

У меня есть несколько dbcontexts, полученных из DbContext, и я хотел бы вызвать этот метод расширения в различных контекстах и ​​ожидать его работы.

Выше код приводит к следующей ошибке

Тип 'T' нельзя использовать в качестве параметра типа 'TContext' в универсальном c типе или методе 'EntityFrameworkServiceCollectionExtensions.AddDbContext (IServiceCollection, Action, ServiceLifetime, ServiceLifetime ). Конвертирование или преобразование параметров типа из 'T' в 'Microsoft.EntityFrameworkCore.DbContext'

отсутствует.

1 Ответ

1 голос
/ 18 апреля 2020

services.AddEntityFrameworkSqlServer().AddDbContext - это метод c, но он может принимать только тип T, который DbContext. Это означает, что T должен быть либо DbContext, либо типом, который наследует DbContext.

. Вы хотите передать T извне метода AddCustomDbContext, что означает, что вам необходимо убедиться, что метод AddCustomDbContext также принимает T, который DbContext или унаследован от DbContext.

Для этого вам нужно использовать ограничение generi c. Используя ограничение generi c, вы можете установить ограничение для типов, которые можно использовать как T в методе, классе или событии generi c.

Необходимо изменить сигнатуру метода следующим образом, чтобы он примет только T, который наследуется от DbContext.

 public static IServiceCollection AddCustomDbContext<T>(this IServiceCollection services, IConfiguration configuration) 
    where T : Microsoft.EntityFrameworkCore.DbContext
 {
     //rest of the code remains same.
 }

Надеюсь, это поможет решить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...