2017-08-16 297 views
0

我工作的一個Web應用程序與ASPNET核心1.1 我做了一個類從API發送一些信息(控制器方法)到RabbitMQ的服務器,像這樣ASPNET核心註冊服務

public interface IRabbitMqAccessLayer<TCaller> where TCaller : class 
{ 
    bool SendMessage(string message); 
} 

public class RabbitMqAccessLayer<TCaller>: IRabbitMqAccessLayer<TCaller> where TCaller : class 
{ 
    // some internal variables 

    public RabbitMqAccessLayer(IConfigurationRoot config, IHttpContextAccessor httpContextAccessor) 
    { 
     // class initialization 
    } 

    public bool SendMessage(string message) 
    { 
     // send the message 
    } 
} 

TCaller是使用服務(就像你使用一個logger)

public class TestController: Controller 
{ 
    private readonly IRabbitMqAccessLayer<TestController> _rabbit; 

    public TestController(IRabbitMqAccessLayer<TestController> rabbit) 
    { 
     _rabbit = rabbit; 
    } 

    public IActionResult Get() 
    { 
     _rabbit.SendMessage("some message"); 
     return Ok(); 
    } 
} 

問題(或者更好,我的錯)是我不知道燙正確配置類(控制器)服務在應用程序啓動

public void ConfigureServices(IServiceCollection services) 
{ 
    // some services 
    services.AddSingleton<IRabbitMqAccessLayer, RabbitMqAccessLayer>(); // <-- ERROR 
    // some other services 
} 

這給了我一個錯誤[CS0305] Using the generic type 'IRabbitMqAccessLayer<TCaller>' requires 1 type argument,因爲類需要呼叫者這是有道理的,但我該如何登記指定它(因爲很明顯,主叫類每個控制器會發生變化)?

回答

0

自我回答這個問題,也許這將幫助別人:

services.AddSingleton(typeof(IRabbitMqAccessLayer<>), typeof(RabbitMqAccessLayer<>));