4

私は autofac ライブラリと singalR ライブラリの両方にまったく慣れていないので、簡単に教えてください! ブートストラップには、signalR なしで単独で動作する次のコードがあります。

var builder = new ContainerBuilder();
builder.RegisterControllers(Assembly.GetExecutingAssembly());
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).AsImplementedInterfaces();

builder.RegisterType<DatabaseFactory>().As<IDatabaseFactory>().InstancePerHttpRequest();
builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().InstancePerHttpRequest();

builder.RegisterAssemblyTypes(typeof(adminRepository).Assembly).Where(t => t.Name.EndsWith("Repository")).AsImplementedInterfaces().InstancePerHttpRequest();

builder.RegisterAssemblyTypes(typeof(adminService).Assembly).Where(t => t.Name.EndsWith("Service")).AsImplementedInterfaces().InstancePerHttpRequest();

builder.RegisterFilterProvider();
IContainer container = builder.Build();

DependencyResolver.SetResolver(new Autofac.Integration.Mvc.AutofacDependencyResolver(container));

上記のコードは問題なく動作しますが、以下のコードでハブを登録した後は動作しません。

builder.RegisterType<Chat>().InstancePerLifetimeScope();

builder.RegisterFilterProvider();
IContainer container = builder.Build();

DependencyResolver.SetResolver(new Autofac.Integration.Mvc.AutofacDependencyResolver(container));

SignalR.IDependencyResolver resolver = new SignalR.Autofac.AutofacDependencyResolver(container);
GlobalHost.DependencyResolver = resolver;
RouteTable.Routes.MapHubs(resolver);

this (https://github.com/pszmyd/SignalR.Autofac) から Autofac にバインドする SignalR 依存関係リゾルバーを使用しています。

私はこのような単純なハブを持っています。

public class Chat : Hub
{
    private readonly IadminService adminService;
    public Chat(IadminService adminService)
    {
        this.adminService = adminService;
    }

    public void Send(string message)
    {
        Clients.addMessage(message);
    }
}

これは、ハブに DI を使用しようとしたときに発生したエラーです。

「「httpRequest」に一致するタグを持つスコープは、インスタンスがリクエストされたスコープから見えません。」

私が何をしても、それを機能させることができないようです.誰かが上記のコードの何が問題なのか教えていただければ幸いです.

どうもありがとうレオ

4

2 に答える 2

3

IIS でホストされる ASP.NET アプリケーションの場合、これを Application_Start に追加します。

var container = AutofacConfig.BuildContainer();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
var signalRDependencyResolver = new SignalRAutofacDependencyResolver(container);
// old SignalR 1.0 way - routes.MapHubs(signalRDependencyResolver);
RouteTable.Routes.MapHubs(new HubConfiguration { Resolver = signalRDependencyResolver });

SignalRAutofacDependencyResolver hereを見つけることができます。

ISecurity サービスを注入するハブの例:

public class ExampleHub : Hub
{
    private static int _count = 0;

    private readonly ISecurity _security;
    public ExampleHub(ISecurity security)
    {
        _security = security;
    }

    public void GetCount()
    {
        _count++;
        Clients.All.SetCount(_count);         
    }
}

これは、SignalRセルフ ホスト リリースでも機能します。次のようなスタートアップ クラスを使用するだけです。

// These are static variables in Program.cs - Probably a better way to do this
_container = AutofacConfig.BuildContainer();
_webServer = WebApp.Start<WebServerStartup>("http://localhost:8080");

public class WebServerStartup
{
    private readonly SignalRAutofacDependencyResolver _signalRDependencyResolver;

    public WebServerStartup()
    {
        _signalRDependencyResolver = new SignalRAutofacDependencyResolver(_container); 
    }

    public void Configuration(IAppBuilder app)
    {
        app.MapSignalR(new HubConfiguration { Resolver = _signalRDependencyResolver });
    }
}
于 2013-09-13T15:24:18.500 に答える
1

DependencyResolver を設定した後、それを MapHubs に渡す必要がありますか?代わりにこれを試してください:

GlobalHost.DependencyResolver = resolver;

RouteTable.Routes.MapHubs();

SignalR は知っていますが、Autofac を使用したことはありませんが、考えられる Autofac の問題の詳細については、これらの回答を確認する価値があるかもしれません。

Autofac InstancePerHttpRequest を解決する方法

Autofac、ASP.NET MVC 3 httpRequest スコープおよび AutoMapper: 「httpRequest」に一致するタグを持つスコープが表示されない

于 2012-09-25T13:31:12.983 に答える