Как передать несколько параметров интерфейса в конструкторе контроллера web API, если я использую внедрение зависимостей?

#c# #asp.net-core #asp.net-web-api #dependency-injection

#c# #asp.net-ядро #asp.net-web-api #внедрение зависимостей

Вопрос:

Я использую внедрение зависимостей для вызова своих объектов, так есть ли более аккуратный способ добавления дополнительных параметров в конструктор без увеличения длины подписи конструктора, как в моем случае ниже?

    public ObjectController(IParam1 param1, IParam2 param2, IParam3 param3, 
   IParam4 param4,IParam5 param6,IParam7 param8)
    {
        _param1= param1;
        _param2 = param2;
        _param3= param3;
        _param4= param4;
        _param5= param5;
        _param6= param6;
        _param7= param7;
        _param8= param8;
    }
 

Комментарии:

1. Если я правильно понимаю вопрос, я не думаю, что есть другой способ сделать это. Но, вообще говоря, большое количество зависимостей для одного класса, вероятно, означает, что вам нужно переосмыслить свой дизайн.

2. Нет, но это возможный признак того, что у вашего контроллера слишком много обязанностей

3. Если бы у меня была пара объектов, связанных с контроллером, каков наилучший способ или дизайн для его обработки или разбить его, чтобы избежать множества параметров?

Ответ №1:

Как уже говорили другие, ваш контроллер несет слишком большую ответственность. Я бы рекомендовал вам разбить свою функциональность на службы / службы бизнес-логики.

 public class UserService : IUserService {
    
    IParam _param;
    IParam2 _param2;
    
    public UserService(IParam param, IParam2 param2) {
        _param = param;
        _param2 = param2;
    }
}


public class LoginService : ILoginService {
    
    IParam _param;
    IParam2 _param2;
    
    public UserService(IParam param, IParam2 param2) {
        _param = param;
        _param2 = param2;
    }
}
 

Затем вы можете внедрить его в свой контроллер

 public Controller(IUserService userService, ILoginService loginService) { ... }
 

И если это все еще слишком много, я бы рекомендовал также разделить ваш контроллер.

Комментарии:

1. Это известный рефакторинг с именем Facade Services .