Инъекция зависимостей в библиотеках классов, которые соединены вместе?

    Date userDob = new SimpleDateFormat("yyyy-MM-dd").parse(dob);
    Date today = new Date();
    long diff =  today.getTime() - userDob.getTime();
    int numOfYear = (int) ((diff / (1000 * 60 * 60 * 24))/365);
    int numOfDays = (int) (diff / (1000 * 60 * 60 * 24));
    int hours = (int) (diff / (1000 * 60 * 60));
    int minutes = (int) (diff / (1000 * 60));
    int seconds = (int) (diff / (1000));
0
задан snappymcsnap 13 July 2018 в 12:36
поделиться

1 ответ

Вы просто регистрируете свои типы и предоставляете публичный конструктор, который определяет требования, и если они доступны, волшебство произойдет. Если вы используете crypto-провайдера, вы можете зарегистрировать его по-другому:

services.AddSingleton(cryptoSettings);
services.AddSingleton<ICryptoProvider, DefaultCryptoProvider>();

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

Также проверьте различные методы сбора сервисов - не все классы должны быть одиночными.


class UserRepository : IUserRepository{
    UserRepository(IDatabaseContext context, ICryptoProvider provider){
    }
}

и зарегистрируйте его:

services.AddTransient<IUserRepository, UserRepository>();

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

class UserService : IUserService{
    UserService(IUserRepository userReposiotry, IMembershipRepository membershipRepository){
    }
}

и конструктор контроллера выглядит следующим образом:

    UserController(IUserService service){
    }

С точки зрения контроллера вам все равно, что требуются два репозитория, и каждый из них требует контекста базы данных и поставщика криптографии. Контролеру просто нужно проверить полезную нагрузку, и если действительное задание делегировано службе для обработки. В свою очередь сервис не заботится о внутренней логике и требованиях к репозиториям.

Что касается регистраций, то это серия вызовов в коллекции services AddTransient<Interface,Class>(). И да, вы получите соотношение 1: 1 между интерфейсами и классами. Это хорошо для модульного тестирования.

1
ответ дан Steven 17 August 2018 в 12:51
поделиться
  • 1
    Извините, я не понимаю вас, как контроллер получает ссылку на репозиторий, в котором он нуждается, без создания экземпляра? Это то, что вы регистрируете его в процессе запуска и используете конструктор контроллера для параметра репо? открытый класс MyController (IRepository repo)? – snappymcsnap 13 July 2018 в 12:52
  • 2
    Да - почти IRepository является общим, так как будет много репозиториев, вам нужно что-то зарегистрированное и достаточно конкретное, чтобы быть уникальным, поэтому IUserRepository. И тяжелый подъем выяснения того, что нужно создать, выполняется для вас в результате реализации DI. – Rafal 13 July 2018 в 13:00
  • 3
    – snappymcsnap 13 July 2018 в 13:06
  • 4
Другие вопросы по тегам:

Похожие вопросы: