Зарегистрируйте зависимость с помощью Scrutor

#.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 знал бы, как найти необходимый интерфейс