Вместо замены IAppActivator вы можете просто зарегистрировать аргументы конструктора Startup с помощью Katana ServiceProvider.
Активатор IAppActivator по умолчанию будет разрешать любые службы, соответствующие типам аргументов конструктора запуска. Единственным недостатком является то, что вы не можете использовать 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, как я предлагаю в своем предыдущем ответе.
Однако я оставляю свой предыдущий ответ, поскольку он более подробно объясняет, как устроен класс Startup и как заменить реализации службы по умолчанию с помощью словаря настроек.
person
halter73
schedule
28.01.2014