signalR の global.asax に構造マップの依存関係リゾルバーを含めると、クライアント関数への呼び出しがブラウザーに到達しなくなりますが、ログ パイプラインにある場合は確認できます。
これが私の global.asax の抜粋です。
var container = ObjectFactory.Container;
// Now configure SignalR, MVC, ASP.Net and SharpRepository
GlobalHost.HubPipeline.AddModule(new ErrorHandlingPipelineModule());
GlobalHost.HubPipeline.AddModule(new LoggingPipelineModule());
// TODO: Work out why this breaks the connection between the server and the client.
GlobalHost.DependencyResolver =
ObjectFactory.GetInstance<IDependencyResolver>();
RouteTable.Routes.MapHubs();
DependencyResolver.SetResolver(
new StructureMapDependencyResolver(container));
GlobalConfiguration.Configuration.DependencyResolver =
new StructureMapDependencyResolver(container);
RepositoryDependencyResolver.SetDependencyResolver(
new SharpRepository.Ioc.StructureMap.StructureMapDependencyResolver(container));
ここでは、構造マップ リゾルバーの実装を示します。
public class StructureMapSignalRDependencyResolver
: DefaultDependencyResolver
{
private readonly IContainer _container;
public StructureMapSignalRDependencyResolver(
IContainer container)
{
if (container == null)
{
throw new ArgumentNullException("container");
}
_container = container;
}
public override object GetService(Type serviceType)
{
object result = null;
try
{
result =
!serviceType.IsAbstract &&
!serviceType.IsInterface &&
serviceType.IsClass
? _container.GetInstance(serviceType)
: (_container.TryGetInstance(serviceType)
?? base.GetService(serviceType));
}
catch (Exception ex)
{
Tracing.Error(
"[StructureMapSignalRDependencyResolver]",
Tracing.SerializeException(ex));
}
if (result == null)
{
Tracing.Information(
"[StructureMapSignalRDependencyResolver]",
"Could retrieve object of type {0}",serviceType.ToString());
}
return result;
}
public override IEnumerable<object> GetServices(
Type serviceType)
{
IEnumerable<object> result = null;
try
{
result = _container.GetAllInstances(serviceType)
.Cast<object>().Concat(
base.GetServices(serviceType));
}
catch (Exception ex)
{
Tracing.Error(
"[StructureMapSignalRDependencyResolver]",
Tracing.SerializeException(ex));
}
if (result == null)
{
Tracing.Information(
"[StructureMapSignalRDependencyResolver]",
"Could retrieve object of type {0}", serviceType.ToString());
}
return result;
}
public override void Register(Type serviceType,
Func<object> activator)
{
Tracing.Information(
"[StructureMapSignalRDependencyResolver]",
"Registering object of type {0}",
serviceType.ToString());
base.Register(serviceType, activator);
}
public override void Register(Type serviceType,
IEnumerable<Func<object>> activators)
{
Tracing.Information(
"[StructureMapSignalRDependencyResolver]",
"Registering object of type {0}",
serviceType.ToString());
base.Register(serviceType, activators);
}
}
ここに StructureMap Registry の実装があります (アプリケーション アセンブリを含むものは他にもたくさんあります)。
[RegistryOrder(Order = 6)]
public class SignalRRegistry : Registry
{
public SignalRRegistry()
{
For<IDependencyResolver>().Singleton()
.Use<StructureMapSignalRDependencyResolver>();
For<IHubConnectionContext>().Singleton()
.Use(GlobalHost.ConnectionManager
.GetHubContext<BOSSHub>().Clients);
}
//public void Configure()
//{
// GlobalHost.DependencyResolver =
// ObjectFactory.GetInstance<IDependencyResolver>();
// RouteTable.Routes.MapHubs();
//}
}
依存関係がなくなるように、Hub クラスをロールバックしました。WhatDoIHave からの出力には、Microsoft.AspNet.SignalR のエントリがいくつかあるようですが、具体的な関係はありません。
レジストリのステップを見逃したのではないでしょうか? どこにも例外はありません。global.asax から GlobalHost.DependencyResolver 行をコメントアウトすると、機能しなくなります。
誰かが彼らのために働いているsignalRのDI実装を私と共有してくれることを願っています.
どうもありがとう
更新: 不適切な書式設定を整理していただきありがとうございます - 感謝します。
更新: 問題を示す小さなテスト プロジェクトをまとめました。正直に言うと、私が取り組んでいるアプリケーションとしてそれを再現できたことに驚きました。かなり大規模で複雑で、多くの StructureMap が進行中です。私は GitHub にアップロードしました: https://github.com/johnk27stars/SignalRTest.git - 時間を割いて見てくれた人に感謝します。