1

私は、選択した IoC コンテナーとして Autofac を使用しています。この質問の残りの部分は、SignalR と組み合わせて SignalR を参照しますが、答えるのに実際の SignalR の知識は必要ありません。これは、Autofac に根ざした問題です。

Autofac を SignalR の依存関係リゾルバーとして使用する一環として、自分の好きなように構成された独自の IJsonSerializer インスタンスを提供したいと考えています。ただし、その IJsonSerializer インスタンスを残りのソフトウェア全体で共有したくはありません。

これを実現するために、登録を追加して新しいライフタイム スコープを作成し、そのスコープを依存関係リゾルバーに提供しました。これが私の問題が始まったときです。

私が気付いていなかったのは、これを行うことで、以前にルートコンテナーから取得されていた SignalR から要求されたインスタンスごとのライフタイムスコープの依存関係が、現在はライフタイムスコープから要求されているため、SignalR 全体で共有されていることです。これは良くない。たとえば、存続期間の短いデータベース セッションは、アプリケーションの存続期間中共有されるようになりました。

ライフタイム スコープごとのインスタンスの依存関係に、基本的に、SignalR に渡すライフタイム スコープを使用して依存関係を再利用してはならないふりをさせるにはどうすればよいですか? または、ライフタイムスコープを完全に作成しないようにするにはどうすればよいですか?

4

3 に答える 3

1

質問は数か月前のものですが、私が使用した方法をあなたと共有すると思いました (おそらく誰かがそれを改善できるでしょう)。

ハブにイベントを追加して、ハブが破棄されたときに発生させました。(とにかく、いくつかの一般的なロジックがすでに配置されているため、実際にはベースハブを介して)

public event Action OnDisposing;

protected override void Dispose(bool disposing)
{
    if (OnDisposing != null) OnDisposing.Invoke();
}

これを使用して、autofac がこのハブを登録する方法を変更しました。解決時に、新しい有効期間スコープが作成され、スコープの dispose メソッドは、ハブが破棄されるときに起動するように設定されます。

builder.Register(x =>
{
    ILifetimeScope scope = x.Resolve<ILifetimeScope>().BeginLifetimeScope();
    MyHub hub = new MyHub(scope.Resolve<IMyDependency>());
    hub.OnDisposing += scope.Dispose;
    return hub;
})
.As<MyHub>().InstancePerDependency();
于 2013-04-21T11:25:25.410 に答える
1

Autofac MVC サポートに依存することで、HTTP コンテキストごとの有効期間スコープの作成をサポートするために、SignalR の Autofac 統合を書き直すことになりました。

https://github.com/bytenik/Autofac.Integration.Mvc.SignalR

(これは Autofac.Integration.SignalRではなく、Autofac.Integration.Mvc .SignalR であることに注意してください。)

于 2013-02-02T15:16:35.493 に答える
0

優先する IJsonSerializer 実装を Named または Keyed 登録として設定し、それに依存するコンポーネントによって具体的に要求されるようにすることを検討できます。SignalR については、それがどのように、またはどこで達成されるかを説明できるほど十分に知っているわけではありませんが、実行可能な解決策を見つけるのに役立つかもしれません。

詳細: http://code.google.com/p/autofac/wiki/TypedNamedAndKeyedServices

于 2013-02-01T17:34:42.607 に答える