Asp.Net Core API注入了signleton依赖

时间:2017-04-28 21:56:59

标签: c# asp.net .net dependency-injection asp.net-core

作为我的应用程序的一部分,我有一个.Net Core API项目。与此项目作为自己的进程运行的大多数情况不同,我打算让API在一个线程中运行,其中包括一个进程。这样做的原因是API充当Web界面,在与本地控制台界面相同的级别上运行。两个接口共享一个单独的对象并对其执行操作(异步)。至少那是计划。但是,我遇到了一个问题。

我有这个Startup.cs用于API:

public class Startup
{
    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
            .AddEnvironmentVariables();
        this.Configuration = builder.Build();
    }

    public IConfigurationRoot Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {.
        services.AddMvc();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        loggerFactory.AddConsole(this.Configuration.GetSection("Logging"));
        loggerFactory.AddDebug();

        app.UseMvc();
    }
}

..这是默认的一些小改动,这个方法用于启动API:

public static void Run()
{
    var host = new WebHostBuilder()
        .UseKestrel()
        .UseContentRoot(Directory.GetCurrentDirectory())
        .UseIISIntegration()
        .UseStartup<Startup>()
        .Build();

    host.Run();
}

我无法弄清楚如何将我的实例化对象传递给Startup,以便我可以将其注册为单例并使其与控制器一起使用。

有办法做到这一点吗?如果没有,那么我可以采取其他方法吗?

1 个答案:

答案 0 :(得分:1)

创建对象并在StartupServices中将其注册为单身者有什么问题?

services.AddSingleton<ISingleton>(new MySingleton());
services.AddSingleton(new MySingleton());

或者您可以提供Func来使创建变得懒惰并提供依赖关系:

services.AddSingleton(provider =>
{
    var fooDependency = provider.GetService<FooDependency>();

    return new MySingleton(fooDependency);
});

或者您可以将对象创建委托给工厂类(也是懒惰的):

services.AddSingleton(provider => provider.GetService<MyFactory>().CreateMySingleton());

文档:Service Lifetimes and Registration Options