c# - 在使用具有潜在作用域依赖关系的 Simpleinjector 时处理 Websharper Remoting Singletons 的最佳方法是什么?
问题描述
我正在尝试将我在基本 Websharper 设置下工作的应用程序转换为 ASP.NET Core 应用程序,使用简单注入器进行 DI,但无法完全正确地配置。由于 Websharper 的 Remoting Abstraction,我想我错过了一个抽象。我应该如何两全其美?
我将 Websharper 与 ASPNETCORE Nuget 包一起使用,SimpleInjector 与 ASPNETCORE Nuget 包一起使用,以及我自己的自定义库。
我已经使用下面的代码将事情作为单例工作,但我更愿意能够使用正确的范围...
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>());
需要注意的是,我必须这样做,因为 Websharper 的AddHandler
方法需要一个实例,并且似乎在内部处理诸如单例之类的问题。
解决方案
推荐阅读
- html - 如何在打印预览中仅在行与页脚重叠的地方隐藏 HTML 表格行的列边框?
- express - express-handlebars 助手不显示返回值
- string - 如何在 Prolog 中连接字符串
- ruby-on-rails - 模型中链接布尔值的验证 - Rails 5.2
- c# - 改进的选择排序越界错误
- powershell - 如何在 LastWriteTime 上同步 2 个共享而不删除
- python - 从嵌套的 JSON 文件中提取值
- php - Doctrine 批量插入 - 如何使用 Doctrine / Symfony 4 通过批量插入修复“内存不足”
- python - 尝试访问另一个函数中的字典值
- c - 如何读取 C 中特定关键字的 json 数据包?