通过自动类寄存器传递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;
}
}
我认为你在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();