#.net #asp.net-core #dependency-injection #scrutor
Вопрос:
У меня есть 3 проекта
1 с контроллерами
2 с помощью служб приложений
3 с интерфейсами
Я написал интерфейс
public interface ICheckoutAppService
{
OrderDto GetOrder();
}
Затем внедрите его в службу приложений
public class CheckoutAppService : ICheckoutAppService
{
public OrderDto GetOrder()
{
var checkout = new OrderDto
{
Amount = 50,
ServiceType = "ecom",
BillRefNo = "BIZ-TEST-PR05004",
CurrencyCode = "SGD",
Payee = "{{payee_payeeliquid}}",
OrderId = "Order_11121314",
OrderItems = new List<OrderItemDto>
{
new()
{
ItemName = "Dell Laptop",
ItemNumber = "1",
ItemUnitPrice = 1000,
OrderQuantity = 1
},
new()
{
ItemName = "Dell Monitor",
ItemNumber = "1",
ItemUnitPrice = 500,
OrderQuantity = 1
}
}
};
return checkout;
}
А затем я вызываю его из контроллера в первых проектах, вот так
[Route("api/[controller]")]
public class CustomersController : Controller
{
private readonly ICheckoutAppService _checkoutAppService;
public CustomersController(ICheckoutAppService checkoutAppService)
{
_checkoutAppService = checkoutAppService;
}
[HttpGet]
public OrderDto Get()
{
try
{
return _checkoutAppService.GetOrder();
}
catch (Exception ex)
{
throw ex;
}
}
}
Я регистрирую интерфейс при запуске через Scrutor следующим образом
services.Scan(scan =>
scan.FromAssemblyOf<ICheckoutAppService>()
.AddClasses()
.AsMatchingInterface());
И получите эту ошибку
Система.Исключение InvalidOperationException: Не удается разрешить службу для типа ‘TestTaskShared.Интерфейсы.ICheckoutAppService » при попытке активировать «CheckoutAPI.Контроллеры.CustomersController’.
Как я могу это исправить?
Ответ №1:
Находится ICheckoutAppService
и CheckoutAppService
в той же сборке?.
Если нет, то ваше текущее сканирование использует только проект указанного интерфейса и не найдет класс. Я предполагаю, что класс находится в Appservices
проекте.
Вам нужно будет сделать ссылку на этот проект, чтобы scrutor знал, где искать реализацию.
Подумайте об изменении подхода к сканированию
services.Scan(scan =>
scan.FromAssemblyOf<CheckoutAppService>()
.AddClasses()
.AsMatchingInterface());
Вышесказанное добавит классы из Appservices
проекта в качестве соответствующего интерфейса. И поскольку Appservices
проект ссылался бы на interfaces
проект, scrutor знал бы, как найти необходимый интерфейс