Каков наилучший способ обработки синглетонов Websharper Remoting при использовании Simpleinjector с потенциально зависимыми зависимостями?
Я пытаюсь преобразовать приложение, которое я работаю в рамках базовой установки Websharper, в базовое приложение ASP.NET, используя Simple Injector for DI, но не могу получить конфигурацию совершенно правильно. Я думаю, что пропускаю часть абстракции из-за удаленной абстракции Websharper. Как мне получить лучшее из обоих миров?
Я использую Websharper с пакетом Nuget ASPNETCORE, SimpleInjector с пакетом Nuget ASPNETCORE и свои собственные пользовательские библиотеки.
У меня есть все, чтобы работать как синглтоны с кодом ниже, но я бы предпочел использовать правильную область видимости...
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddSitelet<OddJobSitelet>()
//.AddWebSharperRemoting<OddJobRemoting>() //This will not work, results in a torn lifestyle related error
.AddAuthentication("WebSharper")
.AddCookie("WebSharper", options => { });
IntegrateSimpleInjector(services);
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
InitializeContainer(app);
if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); }
WebSharper.Core.Remoting.AddHandler(typeof(OddJobRemoting), container.GetService<OddJobRemoting>()); //This only takes an instance, which appears to preclude scoping.
app.UseAuthentication()
.UseStaticFiles()
.UseWebSharper()
.Run(context =>
{
context.Response.StatusCode = 404;
return context.Response.WriteAsync("Page not found");
});
}
public static void Main(string[] args)
{
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build()
.Run();
}
private Container container = new Container();
private void IntegrateSimpleInjector(IServiceCollection services)
{
/*services.Add(new ServiceDescriptor(typeof(OddJobRemoting), (aspnetCore) => container.GetService<OddJobRemoting>(), //Tried this, did not help since Websharper Remoting doesn't appear to use ServiceCollection this way*/
ServiceLifetime.Scoped));
container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle();
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.EnableSimpleInjectorCrossWiring(container);
services.UseSimpleInjectorAspNetRequestScoping(container);
}
private void InitializeContainer(IApplicationBuilder app)
{
//If I use anything other than Lifestyle.Singleton for either the remoting Handler or my provider, It results in a torn lifestyle.
container.Register<IJobSearchProvider>(() =>
{
return new SQLiteJobQueueManager(new SQLiteJobQueueDataConnectionFactory(TempDevInfo.ConnString),
TempDevInfo.TableConfigurations["console"], new NullOnMissingTypeJobTypeResolver());
}, Lifestyle.Singleton);
container.Register<OddJobRemoting>(Lifestyle.Singleton);
// Allow Simple Injector to resolve services from ASP.NET Core.
container.AutoCrossWireAspNetComponents(app);
}
}
Как просили:
Если я изменю образ жизни сингла, я получу следующее исключение:
OddJobRemoting зарегистрирован как образ жизни "Async Scoped", но экземпляр запрашивается вне контекста активной области (Async Scoped).
Это происходит на линии:
WebSharper.Core.Remoting.AddHandler(typeof(OddJobRemoting), container.GetService<OddJobRemoting>());
К сведению, я должен сделать это, потому что Уэбшарпер AddHandler
Метод требует экземпляра и, по-видимому, рассматривает такие, как синглтоны, внутри.