我正在使用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
,这是有道理的,因为该类需要一个调用者,但我如何在注册时指定它(因为显然调用者类因每个控制器而异)?
答案 0 :(得分:0)
自我回答这个问题,也许这会对别人有所帮助:
services.AddSingleton(typeof(IRabbitMqAccessLayer<>), typeof(RabbitMqAccessLayer<>));