Внедрение AppDbContext с помощью конструктора с исключением параметров - PullRequest
1 голос
/ 26 марта 2020

Я пытаюсь использовать AppDbContext (принадлежит ядру инфраструктуры сущностей) в одном из моих классов и создавать его с помощью autofa c, вот как это выглядит:

public class AppDbContext : IdentityDbContext<ApplicationUser>
{
    public AppDbContext(DbContextOptions<AppDbContext> options) : base(options)
    {

    }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        builder.Entity<Message>().Property(m => m.Service).HasConversion<int>();
        builder.Entity<ApplicationUser>().HasMany<Message>(m => m.Messages).WithOne(u => u.User).IsRequired();
        base.OnModelCreating(builder);
    }


    public DbSet<Message> Messages { get; set; }
    public DbSet<UsersCredentialsModel> UsersCredentialsModels { get; set; }
    public DbSet<CookieModel> CookieModel { get; set; }


}

Я трудно понять, как правильно это реализовать. Может ли кто-нибудь бросить кость?

public static IContainer Startup()
{
    var builder = new ContainerBuilder();
   // builder.RegisterType<AppDbContext>().As<IdentityDbContext<ApplicationUser>>().InstancePerRequest();

    builder.RegisterType<Application>().As<IApplication>();
    builder.RegisterType<RabbitMQImpl>().As<IListenerQueue>().SingleInstance();
    builder.RegisterType<BotFactory>().As<IBotFactory>();
    var instance = QuartzInstance.Instance;
    builder.RegisterType<QueueImpl>().AsImplementedInterfaces();
    builder.RegisterType<ConsumerSchechuler>().AsImplementedInterfaces();
    builder.RegisterType<SchedulerImpl>().AsImplementedInterfaces();
    builder.RegisterModule(new QuartzAutofacJobsModule(typeof(ConsumerSchedulerJob).Assembly)).RegisterAssemblyModules();
    builder.RegisterModule(new QuartzAutofacJobsModule(typeof(DailyCleanUpJob).Assembly)).RegisterAssemblyModules();
    builder.RegisterInstance(QuartzInstance.Instance).AsImplementedInterfaces();
    return builder.Build();

Это ошибка, которую я получаю.

Исключение DependencyResolutionException: Нет конструкторы, найденные с помощью 'Autofa c .Core.Activators.Reflection.DefaultConstructorFinder' для типа 'JobsImpl.DailyCleanUpJob', могут быть вызваны с помощью доступных служб и параметров: Невозможно разрешить параметр 'Utils.AppDbContext context' конструктора 'Void .ctor (Utils.AppDbContext) '.

1 Ответ

1 голос
/ 27 марта 2020

Друг помог мне с этим:

Если вы столкнулись с той же проблемой, вот код:

var contextOptions = new DbContextOptionsBuilder<AppDbContext>().Options;

//... configure options as necessary

builder.RegisterInstance(contextOptions).As<DbContextOptions<AppDbContext>>();
builder.RegisterType<IdentityDbContext>();
builder.RegisterType<AppDbContext>();

Поскольку конструктор AppDbContext получает экземпляр из DbContextOptions<AppDbContext> вам нужно создать его сначала, а затем зарегистрировать экземпляр как DbContextOptions<AppDbContext>.

...