У меня есть простой проект, чтобы опробовать проблему с Mediatr. Когда конкретный класс моего обработчика в ЖЕСТКОМ проекте моего API, он РАБОТАЕТ. Но когда я беру этот класс обработчика в другой проект (и API ссылается на этот проект ofc), он НЕ разрешает реестр.
Я получаю такую ошибку:
Обработчик не найден для запроса типа MediatR.IRequestHandler`2 [MyBiz.GetTokenModelRequest, MyBiz.TokenModel]. Зарегистрируйте свои обработчики в контейнере. См. Примеры в GitHub.
У меня есть эта структура в моем проекте, а также показано, где она работает, а где нет:
Для подробностей вот коды:
MyApi2 -> Startup.cs:
namespace MyApi2
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddMediatR();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseMvc();
}
}
}
MyApi2 -> ValuesController:
namespace MyApi2.Controllers
{
[Route("api/[controller]")]
public class ValuesController : Controller
{
private readonly IMediator _mediator;
public ValuesController(IMediator mediator)
{
_mediator = mediator;
}
[HttpGet]
public async Task<IEnumerable<string>> Get()
{
try
{
var rr = await _mediator.Send(new GetTokenModelRequest());
}
catch (Exception ex)
{
throw;
}
return new string[] { "value1", "value2" };
}
}
}
MyBiz -> GetTokenModelRequest
namespace MyBiz
{
public class GetTokenModelRequest : LoginModel, IRequest<TokenModel>
{
}
public class LoginModel
{
public string Username { get; set; }
public string Password { get; set; }
}
public class TokenModel
{
#region Properties
public Guid Id { get; set; }
public string Username { get; set; }
public string Token { get; set; }
public DateTime Expiration { get; set; }
#endregion
}
}
MyInftra -> TokenQueryHandler
namespace MyInfra
{
public class TokenQueryHandler : ITokenQueryHandler
{
public Task<TokenModel> Handle(GetTokenModelRequest request, CancellationToken cancellationToken)
{
return Task.FromResult(new TokenModel());
}
}
}
Итак, если я ПЕРЕМЕЩУ TokenQueryHandler
с MyInfra
на MyApi
, это сработает, но я смогу поместить его в проект ссылок, верно?
services.AddMediatR();
внутриConfigureServices(IServiceCollection services)
- person E-A   schedule 25.03.2019