AutoFac LifeTime:在特定情况下强制新实例

时间:2012-01-20 09:56:08

标签: c# entity-framework-4 inversion-of-control autofac

我有以下配置:

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

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

EntityContext显然是继承自MyDbContext的{​​{1}}继承自DbContext

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

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

这可确保每个http请求一个ctx ,这就是我想要的。但是现在我需要对于特定的存储库,我希望EntityContext的不同的实例比正常使用的那样。

你将如何实现这一目标?以下是我的想法:

  • 我使用Register<EntityContext>()....As<DbContext>()...
  • 的另一个配置

还有其他想法吗?

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

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