通过自动类寄存器传递DbContext对象作为参数

本文关键字:对象 DbContext 参数 寄存器 | 更新日期: 2023-09-27 18:18:11

我有一个MVC中的两层架构应用程序(Web和Service)。我已经在web项目的startup方法中注册了我的服务类,如下所示

protected void Application_Start()
{
    var containerBuilder = new ContainerBuilder();
    containerBuilder.RegisterControllers(typeof(MvcApplication).Assembly);
    containerBuilder.RegisterModelBinders(Assembly.GetExecutingAssembly());
    containerBuilder.RegisterModelBinderProvider();
    containerBuilder.RegisterType<SearchService>().As<ISearchService>();

    var container = containerBuilder.Build();
    DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}

我已经创建了一个带有接口的DbContext,如下所示

public interface IApplicationDbContext
{
    DbSet<Customer> Customers { get; set; }
}

我有一个这样的DbContextClass

public class ApplicationDbContext : 
    IdentityDbContext<User, Role, Guid, UserLogin, UserRole, UserClaim>,
        IApplicationDbContext
{
    public ApplicationDbContext() : base("DefaultConnection")
    {
        Database.SetInitializer(new CreateDatabaseIfNotExists<ApplicationDbContext>());        
    }
}

我的问题是,我想把DbContext对象作为参数传递给下面的服务类,就像这样

public class SearchService : ISearchService
{
    IApplicationDbContext _dbContext;
    public QueueService(IApplicationDbContext context)
    {
       _dbContext = context;
    }
}

通过自动类寄存器传递DbContext对象作为参数

我认为你在MVC控制器中使用SearchService,所以你必须在那里创建ISearchService实例。在这种情况下,autofacc可以在你的控制器中进行构造函数注入。

public class ExampleController : Controller
{
    ISearchService _svc;
    public B2BHealthApiController(ISearchService s)
    {
        _svc = s;
    }
}

当Autofac创建ISearchService的实例时,引擎定义ISearchService需要IApplicationDbContext的实例并自动创建它(相同的构造函数注入)。

你只需要说Autofac where take IApplicationDbContext和ISearchService实例。添加到Application_Start

builder.RegisterType<ApplicationDbContext>()                
            .As<IApplicationDbContext>()
            .InstancePerDependency();
builder.RegisterType<SearchService>()               
            .As<ISearchService>()
            .InstancePerRequest();