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));
Вы просто регистрируете свои типы и предоставляете публичный конструктор, который определяет требования, и если они доступны, волшебство произойдет. Если вы используете 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 между интерфейсами и классами. Это хорошо для модульного тестирования.