AutoFac LifeTime: форсировать новый экземпляр в конкретной ситуации - PullRequest
3 голосов
/ 20 января 2012

У меня есть следующая конфигурация:

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) {...}

Это гарантирует, что один ctx на запрос http , что я и хочу. Но теперь мне нужно, чтобы для конкретного репозитория я хотел иметь другой экземпляр EntityContext, чем обычно используется.

Как бы вы этого достигли? Мне пришло в голову следующее:

  • Еще один конфиг, где я использую Register<EntityContext>()....As<DbContext>()...

Есть еще идеи?

Ответы [ 2 ]

3 голосов
/ 20 января 2012

Я только что нашел правильное решение, которое могло бы работать, а именно - использовать OwnedInstances AutoFac, если я правильно понял.Например:

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

Этот сценарий особенно полезен, если вы хотите, чтобы MyRepository запускался в другой транзакции, т. Е. Ему нужно иметь экземпляр DbContext, отличный от других репозиториев.

2 голосов
/ 20 января 2012

Если у вас другое жизненное требование, вы должны либо использовать другую конфигурацию, либо вручную вызвать контейнер, чтобы предоставить вам новый экземпляр контекста (или создать экземпляр контекста напрямую, но это не то, что вы не хотите делать при использовании контейнера IoC) .

...