簡體   English   中英

Autofac-帶OWIN的SignalR。 獲取對ContainerBuilder的引用

[英]Autofac - SignalR with OWIN. getting reference to the ContainerBuilder

我有一個使用Autofac的現有MVC 4應用程序,還有其他裝有autofac模塊的程序集。沒有SignalR / autofac集成,就IOC而言,我的應用程序可以完美運行。 我已經添加了SignalR集線器,試圖通過構造函數將依賴項注入其中。 我遵循了文檔並從中實現了代碼示例。

http://autofac.readthedocs.org/en/latest/integration/signalr.html

導致以下此類:

public class SignalRConfig
{
    public void Configuration(IAppBuilder app)
    {
        var builder = new ContainerBuilder();
        var config = new HubConfiguration();

        Assembly thisAssembly = typeof(SignalRConfig).Assembly;

        builder.RegisterHubs(thisAssembly);

        var container = builder.Build();
        config.Resolver = new AutofacDependencyResolver(container);


        app.UseAutofacMiddleware(container);
        app.MapSignalR("/signalr", config);
    }
}

這與添加到我的AssemblyInfo.cs中的這一行掛鈎

[assembly: OwinStartup(typeof(SignalRConfig))]

但是它在運行時不起作用,因為我的集線器沒有無參數構造函數,並且無法解析依賴關系。 我的假設是我正在創建一個新的ContainerBuilder(根據docs),並且此實例上沒有任何注冊。 我實際上想要引用關於我知道所有注冊類型的模塊的ContainerBuilder。 我只是不知道該怎么做。 現有的IOC代碼從global.asax上的application_start運行,而SignalRConfig同時運行。 我不想將ContainerBuilder放在一個盒子里,因為它感覺很臟,但是我找不到其他解決方案。

這是我的nuget軟件包配置的一部分,顯示版本號等

  <package id="Autofac" version="3.5.2" targetFramework="net451" />
  <package id="Autofac.Mvc4" version="3.1.0" targetFramework="net40" />
  <package id="Autofac.Owin" version="3.1.0" targetFramework="net451" />
  <package id="Autofac.SignalR" version="3.0.1" targetFramework="net451" />
  <package id="Autofac.WebApi" version="3.1.0" targetFramework="net40" />
  <package id="Microsoft.AspNet.Mvc" version="4.0.30506.0" targetFramework="net40" />
  <package id="Microsoft.AspNet.Razor" version="2.0.30506.0" targetFramework="net40" />
  <package id="Microsoft.AspNet.SignalR" version="2.2.0" targetFramework="net451" />
  <package id="Microsoft.AspNet.SignalR.Core" version="2.2.0" targetFramework="net451" />
  <package id="Microsoft.AspNet.SignalR.JS" version="2.2.0" targetFramework="net451" />
  <package id="Microsoft.AspNet.SignalR.SystemWeb" version="2.2.0" targetFramework="net451" />
  <package id="Microsoft.AspNet.WebApi" version="4.0.20710.0" targetFramework="net40" />
  <package id="Microsoft.AspNet.WebApi.Client" version="4.0.30506.0" targetFramework="net40" />
  <package id="Microsoft.AspNet.WebApi.Core" version="4.0.30506.0" targetFramework="net40" />
  <package id="Microsoft.AspNet.WebApi.WebHost" version="4.0.30506.0" targetFramework="net40" />
  <package id="Microsoft.AspNet.WebPages" version="2.0.30506.0" targetFramework="net40" />
  <package id="Microsoft.Owin" version="3.0.0" targetFramework="net451" />
  <package id="Microsoft.Owin.Host.SystemWeb" version="2.1.0" targetFramework="net451" />
  <package id="Microsoft.Owin.Security" version="3.0.0" targetFramework="net451" />
  <package id="Owin" version="1.0" targetFramework="net451" />

聽起來您正在將舊的IIS托管機制( Application_Start )與新的OWIN托管( OwinStartup )混合OwinStartup ,這將很難糾正。

如果您使用OWIN托管應用程序,建議您將整個啟動過程切換到OWIN(至少是啟動邏輯),這樣就不必嘗試同步對容器的訪問或傳遞信息。 如果願意,您仍然可以在Global.asax中保留其他事件處理程序( Application_Error等),只需在OWIN啟動類中統一啟動邏輯即可。

您仍然可以通過將“層”分成不同的被調用的啟動類來保持整潔。

public static class Startup
{
  public static void Configuration(IAppBuilder app)
  {
    var container = DependencyConfiguration.Configure(app);
    SignalRConfiguration.Configure(app, container);
    MvcConfiguration.Configure(app, container);
  }
}

public static class DependencyConfiguration
{
  public static IContainer Configure(IAppBuilder app)
  {
    var builder = new ContainerBuilder();
    builder.RegisterHubs(typeof(SignalRConfiguration).Assembly);
    var container = builder.Build();
    app.UseAutofacMiddleware(container);
    return container;
  }
}

public static class SignalRConfiguration
{
  public static void Configure(IAppBuilder app, IContainer container)
  {
    var config = new HubConfiguration();
    config.Resolver = new AutofacDependencyResolver(container);
    app.MapSignalR("/signalr", config);
  }
}

...等等。 重要的一點是您一次注冊了所有依賴項,並且首先添加了Autofac中間件。 然后,您可以傳遞該容器以用於各個應用程序類型設置(如在SignalR上看到的那樣)。

然后使用主啟動類引導整個過程:

[assembly: OwinStartup(typeof(Startup))]

這有很多好處。 您回避了正在遇到的比賽條件; 您無需嘗試對事物進行同步或重新排序; 而且您擁有很多控制權。 如果要移植,它也為ASP.NET vNext設置了更好的位置,因為那時一切都是OWIN。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM