首页 > 解决方案 > 在使用具有潜在作用域依赖关系的 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方法需要一个实例,并且似乎在内部处理诸如单例之类的问题。

标签: c#asp.net-coresimple-injectorwebsharper

解决方案


推荐阅读