Каков наилучший способ обработки синглетонов Websharper Remoting при использовании Simpleinjector с потенциально зависимыми зависимостями? - PullRequest
0 голосов
/ 21 декабря 2018

Я пытаюсь преобразовать приложение, которое я работаю в рамках базовой установки Websharper, в базовое приложение ASP.NET, используя простой инжектор для 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 Вебсхарпера требует экземпляри, кажется, для лечения таких как синглтоны внутри.

...