AutoFac生命周期:在特定情况下强制创建新实例

3

我有以下配置:

builder.Register<EntityContext>().As(
   c=> {
       var entityCtx = new EntityContext();
       //snip snip: some config stuff

       return entityCtx;
   }).As<MyDbContext>().InstancePerLifetimeScope();

EntityContext 显然继承自 MyDbContext ,而后者又继承自 DbContext

在我的存储库构造函数中,我通常使用它们作为:

...
public MyRepository(MyDbContext context) {...}

这会确保每个 HTTP 请求都有一个上下文(ctx),这正是我想要的。但现在我需要为特定存储库使用与通常使用的 EntityContext 不同的实例。
你该怎么做呢?以下是我的一些想法:
  • 另一个配置,其中我使用 Register<EntityContext>()....As<DbContext>()...
还有其他的想法吗?
2个回答

5

我刚找到了一个可行的解决方案,就是使用 AutoFac 的 OwnedInstances ,如果我理解正确的话。例如:

class MyRepository
{
    public MyRepository(Owned<MyDbContext> context, MyDbContext context2)
    {
        //context and context2 are two different object instances
    }
}

如果您想让MyRepository在不同的事务中运行,即需要与其他存储库具有不同的DbContext实例,则此方案特别有用。


2

如果您有不同的生命周期要求,您必须使用另一个配置或手动调用容器来为您提供上下文的新实例(或直接创建上下文实例,但在使用IoC容器时不建议这样做)。


谢谢,你的回答在某种程度上指引了我正确的方向。我刚刚找到了一个使用AutoFac实现这个的解决方案。 - Juri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接