2017-09-15 140 views
0

给出下面的服务注册:何时实例化单例服务?

services.AddSingleton<IMyInterface>(svc => new MyConcreteTpye(svc.GetService<MyEntityFrameworkContext>(), Configuration["Data"])); 

我期望能够自动创建MyConcreteType实例,但事实并非如此。构造函数永远不会被调用。

为什么我需要做这样的事情,以便创建实例?

app.ApplicationServices.GetRequiredService<IMyInterface>(); 

该服务是一个监听器,因此它不会在任何地方显式调用。这是服务的错误用法吗?

+0

'为什么我需要做这样的事情,这样的实例被创建'因为那是何等的依赖?注射一般有效。直到你要求它才会创造出来。你不是说'请现在让我做这件事'。你在说'如果稍后有人要求'IMyInterface',这里是你应该如何创建它,以便你可以给它们'。 – mjwills

+2

请考虑使用'AddSingleton(IServiceCollection,Type,Object)'代替 - https://docs.microsoft.com/en-us/aspnet/core/api/microsoft.extensions.dependencyinjection.servicecollectionserviceextensions。这样你明确地创建对象并将其传入。 – mjwills

+0

@mjwills如果你看到构造函数,我使用'IServiceProvider.GetService'方法,以便超载不起作用 –

回答

0

我认为注册到services的服务应该被明确地称为某个地方,但在您的情况下它可能不是一个好选择。

如果你的“服务”是独立运行,可能你会做这样的:

public class Startup 
{ 
    private IMyInterface _myService; 

    public void ConfigureServices(IServiceCollection services) 
    { 
    } 

    public void Configure(IApplicationBuilder app, IHostingEnvironment env) 
    { 
     _myService = new MyConcreteTpye(app.ApplicationServices.GetService<MyEntityFrameworkContext>(), Configuration["Data"]); 
    } 
} 
+0

这就是我最终做的事情。问题是'MyConreteType'在MyEntityFrameworkContext.OnConfiguring'完成之前被调用,抛出异常 –