2016-09-07 48 views
1

在startup.cs中,我想定義一個擴展的ServiceProvider:它基本上包裝了默認的IServiceProvider實現。自定義IServicePovider不總是使用

public IServiceProvider ConfigureServices(IServiceCollection services) 
{ 
    [...] 
    var servicesProvider = services.BuildExtendedServiceProvider(); 
    return servicesProvider; 
} 

這裏的核心是延長服務提供商實現

/// <summary> 
/// Extends the native asp.net service provider 
/// </summary> 
public class ExtendedServicesProvider : IServiceProvider 
{ 
    private readonly IServiceProvider _serviceProvider; 

    /// <summary> 
    /// Creates a new instance of <see cref="ExtendedServicesProvider"/> provider based on the native mvc <see cref="IServiceProvider"/> 
    /// </summary> 
    /// <param name="serviceProvider"></param> 
    public ExtendedServicesProvider(IServiceProvider serviceProvider) 
    { 
     _serviceProvider = serviceProvider; 
    } 

    /// <inheritDoc /> 
    public object GetService(Type serviceType) 
    { 
     var resolvedService = _serviceProvider.GetService(serviceType); 
     [...] 
     return resolvedService; 
    } 
} 

在啓動時,我可以看到的GetService被稱爲與「單身」生活時間(偉大的!)每個服務 然而,在此之後不再被調用,並且調用默認的ServiceProvider ... 順便說一句,如果我請求IServiceProvider的解析,這是我得到的本地解決方案。

我想我的serviceProvider完全取代原生的,並被稱爲每次。

我錯過了什麼?

回答

0

好吧,我剛剛檢查了源代碼(我應該在發佈問題之前檢查了抱歉)。 https://github.com/aspnet/DependencyInjection/blob/master/src/Microsoft.Extensions.DependencyInjection/ServiceProvider.cs

構建方法本身會將IServiceProvider類型與本地實例相加。 由於似乎沒有辦法正確修改它(沒有反思「_table」字段,我的意思是:-)。在我看來,這種方法顯然不好。

我想我會嘗試其他依賴注入引擎,如Autofac,但我真的想保留本機引擎,在我看來,真的很輕。

相關問題