C#: Создать унаследованный DbContext, нужно ли снова вводить зависимости? - PullRequest
1 голос
/ 30 апреля 2020

Я создал унаследованный класс DbContext от другого DbContext. Для определенных таблиц он выполняет пользовательские элементы, такие как запись информации о пользователях перед SaveChanges.

Необходимо ли снова вводить зависимости в файле Startup.cs?

В противном случае мы получим ошибку ниже.

Ошибка: не зарегистрирован сервис для типа 'IPTS.PropertyManagement.Infrastructure.Repositories.CustomPropertyContext'.

Эта строка кода второй пары решает проблему, просто любопытно, если Любой способ избежать повторной инъекции, или это необходимо?

services.AddDbContext<PropertyContext>(options =>
   options.UseSqlServer(configuration.GetConnectionString("PMConnection")));
services.AddScoped<DbContext, PropertyContext>();

services.AddDbContext<CustomPropertyContext>(options =>
   options.UseSqlServer(configuration.GetConnectionString("PMConnection")));
services.AddScoped<DbContext, CustomPropertyContext>();

Ссылка Пользовательский класс:

public class CustomPropertyContext : PropertyContext
{
    private int _user;

    public CustomPropertyContext()
    {
    }

    public CustomPropertyContext(UserResolverService userService)
    {
        _user = userService.GetUser();
    }

    public void ApplyCreatedBy()
    {
        var modifiedEntities = ChangeTracker.Entries<ICreatedBy>().Where(e => e.State == EntityState.Added);
        foreach (var entity in modifiedEntities)
        {
            entity.Property("CreatedBy").CurrentValue = _user;
        }
    }

    public override int SaveChanges()
    {
        ApplyCreatedBy();
        return base.SaveChanges();
    }
}

Это для системы приложения свойств путь.

1 Ответ

1 голос
/ 01 мая 2020

Эта строка кода второй пары решает проблему, просто любопытно, есть ли способ избежать повторной инъекции, или это необходимо?

Да, вторая пара необходима, поэтому я знаю все типы нужно вводить, как вы сказали в комментарии под вопросом, иногда вы вводите PropertyContext, а иногда и CustomPropertyContext. Так что это правильно, но вы можете упростить код, как показано ниже:

var connectionString = configuration.GetConnectionString("PMConnection");
services.AddDbContext<PropertyContext>(options => options.UseSqlServer(connectionString));
services.AddDbContext<CustomPropertyContext>(options => options.UseSqlServer(connectionString));

Как видите, я удаляю строки, которые внедряют базовый класс DbContext, потому что вы сказали, что не вводите DbContext базовый класс, но указанный c производный класс либо PropertyContext, либо CustomPropertyContext. Также вам нужно знать, что при многократной регистрации одного и того же типа (здесь DbContext) последняя регистрация всегда выигрывает, когда вы запрашиваете экземпляр DbContext. Таким образом, основываясь на приведенном ниже коде:

services.AddScoped<DbContext, PropertyContext>();
services.AddScoped<DbContext, CustomPropertyContext>();

Последняя регистрация побеждает, и вы всегда получите экземпляр CustomPropertyContext, когда вы запросите один экземпляр DbContext.

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