将DbContext对象作为参数传递给autofac类寄存器
问题描述:
我在MVC中有2层体系结构应用程序(Web和服务)。我已经注册了我的服务类在类似下面的Web项目的启动方法,将DbContext对象作为参数传递给autofac类寄存器
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实例。在这种情况下,Autofac可以在您的控制器中进行构造函数注入。
public class ExampleController : Controller
{
ISearchService _svc;
public B2BHealthApiController(ISearchService s)
{
_svc = s;
}
}
当Autofac创建ISearchService的实例,发动机定义ISearchService需要IApplicationDbContext的实例,并创建它全自动(相同的构造注射)。
所以你只需要说Autofac在哪里取IApplicationDbContext和ISearchService实例。添加到您的Application_Start
builder.RegisterType<ApplicationDbContext>()
.As<IApplicationDbContext>()
.InstancePerDependency();
builder.RegisterType<SearchService>()
.As<ISearchService>()
.InstancePerRequest();
你只需要设置你的DbContext的绑定,我不知道如何使用Autofac,但我已经添加了Autofac标签给你们,希望有人会回答。看起来你已经设置了你的容器来扫描当前的程序集,但是你希望它稍后为你的DbContext扫描你的服务层/数据,以便它可以被解析。 – Luke
或者定义一个'IDbContextFactory',您可以在'SearchService'构造函数中使用它来创建所需上下文的实例。无论哪种方式,您需要在容器中注册一些东西,以便容器可以连接所有必需的接口及其实现。 – Maarten
你解决了吗? – Eonasdan