2017-09-15 100 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'完成之前被調用,拋出異常 –