带有类型参数的aspnet核心寄存器服务

时间:2017-08-16 09:36:13

标签: asp.net-core

我正在使用aspnet core 1.1开发一个web应用程序 我创建了一个类,从api(控制器方法)向rabbitmq服务器发送一些消息,类似这样的

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是使用该服务的类(控制器)(就像您使用记录器一样)

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,这是有道理的,因为该类需要一个调用者,但我如何在注册时指定它(因为显然调用者类因每个控制器而异)?

1 个答案:

答案 0 :(得分:0)

自我回答这个问题,也许这会对别人有所帮助:

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