Вместо замены 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, как я предлагаю в своем предыдущем ответе.
Однако я оставляю свой предыдущий ответ, так как он более подробно объясняет, как строится класс запуска и как заменить стандартные сервисные реализации, используя словарь настроек.
Спасибо. Это выглядит хорошо. – Brannon
Мне пришлось бросить 'ServicesFactory.Create()' ServiceProvider, чтобы получить методы Add. Это ожидалось? – Brannon
Вы абсолютно правы. Я обновил свой пример, чтобы вернуть возвращаемое значение из 'ServicesFactory.Create()' в 'ServiceProvider'. Вы можете сказать, что это безопасно, посмотрев на реализацию 'Create': http: //katanaproject.codeplex.com/SourceControl/changeset/view/c726b87e90c05677a256ca1821bac481f402d6bd # src/Microsoft.Owin.Hosting/Services/ServicesFactory.cs – halter73