2017-01-23 32 views
16

考慮下面的接口和類定義:Asp.Net核心:註冊具有多個接口和生活方式實現辛格爾頓

public interface IInterface1 { } 
public interface IInterface2 { } 
public class MyClass : IInterface1, IInterface2 { } 

有沒有什麼辦法來註冊的MyClass具有多個接口的這樣一個實例:

... 
services.AddSingleton<IInterface1, IInterface2, MyClass>(); 
... 

和解決的MyClass具有不同接口的這樣的這樣一個實例:

IInterface1 interface1 = app.ApplicationServices.GetService<IInterface1>(); 
IInterface2 interface2 = app.ApplicationServices.GetService<IInterface2>(); 

回答

18

定義的服務集合是ServiceDescriptor的集合,它們是服務類型和實現類型的對。

可以解決這個然而獲得通過創建自己的供應商的功能,這樣的事情(感謝user7224827):下面

services.AddSingleton<IInterface1>(); 
services.AddSingleton<IInterface2>(x => x.GetService<IInterface1>()); 

更多選擇:

private static MyClass ClassInstance; 

public void ConfigureServices(IServiceCollection services) 
{ 
    ClassInstance = new MyClass(); 
    services.AddSingleton<IInterface1>(provider => ClassInstance); 
    services.AddSingleton<IInterface2>(provider => ClassInstance); 
} 

另一種方法是:

public void ConfigureServices(IServiceCollection services) 
{ 
    ClassInstance = new MyClass(); 
    services.AddSingleton<IInterface1>(ClassInstance); 
    services.AddSingleton<IInterface2>(ClassInstance); 
} 

我們只提供相同的實例。

+36

第三種方法是: 'services.AddSingleton ();'' services.AddSingleton (X => x.GetService ());' 那麼你不需要創建類由你自己。 – 2017-02-20 06:17:09