2

很难尝试使用一些异步非 httprequest 设置 AutoFac。

我在 App_Start 上有以下内容

        var builder = new ContainerBuilder();
        builder.RegisterControllers(typeof(MvcApplication).Assembly);
        builder.RegisterType<sfEntities>().As<IUnitOfWork>().InstancePerHttpRequest();
        builder.RegisterGeneric(typeof(sfRepository<>)).As(typeof(IRepository<>)).InstancePerHttpRequest();
        builder.RegisterGeneric(typeof(BaseServices<>)).As(typeof(IBaseServices<>)).InstancePerHttpRequest();
        builder.RegisterType<EmailServices>().As<IEmailServices>().InstancePerHttpRequest();
        builder.RegisterType<UserServices>().As<IUserServices>().InstancePerHttpRequest();
        builder.RegisterType<ChatServices>().As<IChatServices>().InstancePerHttpRequest();
        builder.RegisterType<DefaultFormsAuthentication>();
        builder.RegisterType<WebSecurity>();
        builder.RegisterType<Chat>();
        IContainer container = builder.Build();
        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

如果我更改为 InstancePerLifetimeScope(),我会遇到 UnitofWork.SaveChanges() 的问题。以这种方式设置工作正常,除了异步调用。

ps:UnitOfWork在服务间传递EF DbContext,保证使用同一个实例,并正确dispose。如果我更改为 InstancePerLifetimeScope,我在调用 .SaveChanges() 时会遇到身份冲突,可能是因为应该有多个 UnitOfWork 实例。

以下代码引发以下异常:

Timer timer = new Timer(new TimerCallback(OnTimer), null, TimeSpan.FromMinutes(1), TimeSpan.FromMinutes(1));

    private static void OnTimer(object o)
    {
         using (var timerScope = AutofacDependencyResolver.Current.ApplicationContainer.BeginLifetimeScope())
         {
             var chatServices = timerScope.Resolve<IChatServices>();
             chatServices.MarkInactiveUsers();
         }
    }

从请求实例的范围中看不到具有与“httpRequest”匹配的标记的范围。这通常表明注册为 per-HTTP 请求的组件正在被 SingleInstance() 组件(或类似场景)请求。在 Web 集成下,始终从 DependencyResolver.Current 或 ILifetimeScopeProvider.RequestLifetime 请求依赖项,而不是从容器本身.

在 SignalR 上,以下代码引发以下异常:

SignalR.GlobalHost.DependencyResolver.Register(typeof(Chat), () => new Chat(DependencyResolver.Current.GetService<IUnitOfWork>(), DependencyResolver.Current.GetService<IChatServices>(), DependencyResolver.Current.GetService<IUserServices>()));

无法创建请求生命周期范围,因为 HttpContext 不可用

提前致谢!

4

2 回答 2

4

很难尝试使用一些异步非 httprequest 设置 AutoFac。

对于非 http 请求,或者更具体地说,对于非 ASP.NET 管道请求(如 WCF 或 ServiceStack),您绝对应该将所有InstancePerHttpRequest()代码更改为InstancePerLifetimeScope(). 您可以而且应该这样做,因为 InstancePerLifetimeScope() 它可以在 ASP.NET 管道和非 ASP.NET 管道上下文中解析

如果我更改为 InstancePerLifetimeScope(),我会遇到 UnitofWork.SaveChanges() 的问题。以这种方式设置工作正常,除了异步调用...如果我更改为 InstancePerLifetimeScope,我在调用 .SaveChanges() 时遇到身份冲突,可能是因为应该有多个 UnitOfWork 实例。

是的,应该有多个 的实例UnitOfWork,但是您可以通过一次注册来实现,该注册的范围应为InstancePerLifetimeScope()

例子:

builder.RegisterType<NhUnitOfWork>().As<IUnitOfWork>().InstancePerLifetimeScope();
于 2013-11-22T16:56:05.270 回答
1

IChatServices服务已注册为InstancePerHttpRequest,因此仅在 http 请求生命周期范围内可用。您正在从无法“访问”当前请求的应用程序范围内解析,因此因您提到的错误而失败。所以是的,要让计时器工作,您必须在应用程序范围内注册服务。

基本上,您可以拥有访问应用程序范围服务的请求范围服务,但反之则不行。

问题是:UnitOfWork.SaveChanges做什么以及你遇到什么“问题”?请详细说明。

于 2012-06-14T20:56:47.310 回答