Я создаю приложение с ASP.Net MVC для внешнего. Autofac используется для инъекций зависимостей. Несколько компонентов/классов зарегистрированы как InstancePerRequest
. Контекст Entity Framework и единица работы (только оболочка, которая вызывает context.SaveChanges()
), регистрируются как InstancePerLifetimeScope
. Пример кода:Autofac не может разрешить класс
builder.RegisterAssemblyTypes(Assembly.GetAssembly(typeof(DomainModule)))
.Where(t => t.IsClosedTypeOf(typeof(IFooService<>)))
.AsImplementedInterfaces()
.AsClosedTypesOf(typeof(IFoo<>))
.InstancePerRequest();
builder.RegisterType<FooContext>()
.AsSelf()
.As<IObjectContextAdapter>()
.InstancePerLifetimeScope();
builder.RegisterType<UnitOfWork>()
.AsImplementedInterfaces()
.AsSelf()
.InstancePerLifetimeScope();
Разрешающая класс из контейнера, используя явный объем бросает следующее исключение:
{"No scope with a Tag matching 'AutofacWebRequest' is visible from the scopein which the instance was requested. This generally indicates that a component registered as per-HTTP request is being requested by a SingleInstance() component (or a similar scenario.) Under the web integration always request dependencies from the DependencyResolver.Current or ILifetimeScopeProvider.RequestLifetime, never from the container itself."}
код, который вызывает вышеуказанное исключение:
using (var scope = _lifetimeScope.BeginLifetimeScope())
{
var authOrchestration = scope.Resolve<IAuthOrchestration>();
apiClient = authOrchestration.GetApiClient(context.ClientId);
}
Обратите внимание, что IAuthOrchestration
не регистрируется такими вещами, как InstancePerRequest
, так что нужно просто по умолчанию InstancePerDependency
.
Я пытаюсь обмотать голову вокруг этого пару часов. Я читал thesetwo статей. Из того, что я прочитал, я думаю, что исключение выбрасывается из-за областей, которые не соответствуют (как описано here). Если кто-то сможет объяснить, почему я получаю эту ошибку, я был бы очень благодарен.
Большое спасибо заранее.
Реализована ли реализация '' IAuthOrchestration'' 'IFoo <>'? –
@CyrilDurand Оркестрация, как упомянутая «IAuthOrchestration», зависит от таких сервисов, как '' IFooService'' (для ясности она была переименована в вопрос). Эти службы зависят от репозиториев, и эти репозитории в конечном счете зависят от '' FooContext''. –
Вы не можете начинать новую область действия с помощью экземпляра InstancePerRequest. Ответ в этом вопросе должен сработать для вас: http://stackoverflow.com/questions/10027330/how-to-resolve-autofac-instanceperhttprequest –