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 を渡し、同じインスタンスが使用され、適切に破棄されるようにします。InstancePerLifetimeScope に変更すると、.SaveChanges() を呼び出すときに ID の競合が発生しました。これは、おそらく 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」に一致するタグを持つスコープは、インスタンスが要求されたスコープから見えません。これは通常、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

1

このIChatServicesサービスはとして登録されているInstancePerHttpRequestため、httpリクエストの有効期間の範囲内でのみ利用できます。現在のリクエストに「アクセス」できないアプリケーションスコープから解決しているため、指定したエラーで失敗します。そうです、タイマーを機能させるには、アプリケーションスコープにサービスを登録する必要があります。

基本的に、アプリケーションスコープのサービスにアクセスするスコープのサービスをリクエストすることはできますが、その逆はできません。

質問は次のとおりです。何をUnitOfWork.SaveChangesし、どのような「問題」が発生しますか?詳しく説明してください。

于 2012-06-14T20:56:47.310 に答える