2014-01-27 3 views
4

С SignalR 2,0 в самопринятом приложении, от these instructions у вас есть что-то вроде этого:использовать инъекцию зависимостей в Signalr 2.0 self-host?

class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     app.MapSignalR(new HubConfiguration { Resolver = ... }); 
    } 
} 
class Program 
{ 
    static void Main(string[] args) 
    { 
     using (WebApp.Start("http://localhost:8080")) // constructs Startup instance internally 
     { 
      Console.WriteLine("Server running on {0}", url); 
      Console.ReadLine(); 
     } 
    } 
} 

Вы заметите, что экземпляр класса создаются при загрузке с некоторыми закулисными магиями. Я не могу понять, как заполнять зависимости от него. Есть ли способ переопределить конструкцию класса Startup, чтобы я мог вставлять в него зависимости?

ответ

2

Вместо замены IAppActivator вы можете просто зарегистрировать аргументы конструктора Startup с помощью ServiceProvider Катаны.

По умолчанию IAppActivator разрешает любые службы, соответствующие типам аргументов конструктора Startup для вас. Единственным недостатком является то, вы не можете использовать WebApp.Start, так что не выставляет ServiceProvider:

public class MyService : IMyService 
{ 
    private readonly IMyOtherService _myOtherService; 

    // Services will be recursively resolved by Katana's ServiceProvider 
    public MyService(IMyOtherService myOtherService) 
    { 
     _myOtherService = myOtherService; 
    } 

    // Implementation 
} 

public class Startup 
{ 
    private readonly IMyService _myService; 

    // Startup must have exactly one constructor. 
    public Startup(IMyService myService) 
    { 
     _myService = myService 
    } 

    public void Configuration(IAppBuilder app) 
    { 
     app.MapSignalR(new HubConfiguration { Resolver = ... }); 
    } 
} 

using System; 
using Microsoft.Owin.Hosting; 
using Microsoft.Owin.Hosting.Services; 
using Microsoft.Owin.Hosting.Starter; 

public class Program 
{ 
    static void Main(string[] args) 
    { 
     var url = "http://localhost:8080"; 

     var services = (ServiceProvider)ServicesFactory.Create(); 
     var options = new StartOptions(url); 

     services.Add<IMyOtherService, MyOtherService>(); 
     services.Add<IMyService, MyService>(); 

     var starter = services.GetService<IHostingStarter>(); 

     using (starter.Start(options)) // constructs Startup instance internally 
     { 
      Console.WriteLine("Server running on {0}", url); 
      Console.ReadLine(); 
     } 
    } 
} 

Я скопированный реализацию по умолчанию WebApp.Start в Program.Main, но вместо немедленного вызова IHostingStarter.Start, добавить пользовательские услуги: первые http://katanaproject.codeplex.com/SourceControl/changeset/view/c726b87e90c05677a256ca1821bac481f402d6bd#src/Microsoft.Owin.Hosting/WebApp.cs

Есть куча других перегрузок для ServiceProvider.Add, если вы нуждаетесь в них: http://msdn.microsoft.com/en-us/library/microsoft.owin.hosting.services.serviceprovider(v=vs.111).aspx

Это должно быть намного проще, чем замена IAppActivator Katana с использованием StartOptions.Settings, как я предлагаю в своем предыдущем ответе.

Однако я оставляю свой предыдущий ответ, так как он более подробно объясняет, как строится класс запуска и как заменить стандартные сервисные реализации, используя словарь настроек.

+0

Спасибо. Это выглядит хорошо. – Brannon

+0

Мне пришлось бросить 'ServicesFactory.Create()' ServiceProvider, чтобы получить методы Add. Это ожидалось? – Brannon

+0

Вы абсолютно правы. Я обновил свой пример, чтобы вернуть возвращаемое значение из 'ServicesFactory.Create()' в 'ServiceProvider'. Вы можете сказать, что это безопасно, посмотрев на реализацию 'Create': http: //katanaproject.codeplex.com/SourceControl/changeset/view/c726b87e90c05677a256ca1821bac481f402d6bd # src/Microsoft.Owin.Hosting/Services/ServicesFactory.cs – halter73

2

Checkout информация зависимости инъекции здесь: http://www.asp.net/signalr/overview/signalr-20/extensibility/dependency-injection

Если есть все, что нужно знать :)

Надеется, что это помогает!

+1

Я уже прочитал этот конкретный документ. Увы, это относится только к IIS, а не к самому себе. Вы заметите, что метод, который они используют 'App.MapSignalR (config)', не существует при самообслуживании. – Brannon

+0

Прочтите еще раз ... Посмотрите прямо над секцией контейнеров IoC. –

+0

Прямо над секцией контейнеров IoC обсуждается введение в классы Hub. У меня нет проблем. Я хочу ввести инжектор ступицы. – Brannon

0
class Startup 
{ 
    private readonly IDependencyResolver _resolver; 

    public Startup(IDependencyResolver resolver) 
    { 
     _resolver = resolver; 
    } 

    public void Configuration(IAppBuilder app) 
    { 
     app.MapSignalR(new HubConfiguration { Resolver = _resolver; }); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Startup startup = new Statrtup(new MyResolver()); 
     using (WebApp.Start("http://localhost:8080", startup.Configuration)) 
     { 
      Console.WriteLine("Server running on {0}", url); 
      Console.ReadLine(); 
     } 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^