콘솔 응용 프로그램에서 의존 주입을 합니까?
11263 단어 csharpprogramming
그러나 그것은 무미건조하기 때문에 나는 최근 몇 년 동안 논쟁의 모델인 주입에 의존하여 그것을 가지고 놀기로 결정했다.왜 안 해요?
그렇다면 의존 주입은 무엇일까?
응, 이건 상당히 책벌레야. 하지만 농구 팬으로서 나도 나만의 독특한 해석 방식이 있어. (완전히 틀린 롤이라면 마음대로 공격해)
상상해 보세요. 헬스장에 가서 슛을 해요. 보통 슛을 하고 자신의 공을 튕기고 심지어 공을 쫓아다니다가 당신의 위치로 돌아오면 슛을 할 수 있고 이 과정을 다시 반복할 수 있어요.
이제 의존 주입에서 당신이 해야 할 일은 공을 던지는 것이다. 공이 필요할 때, 공이 자동으로 당신에게 전달되기 때문이다.
지금 컴파일러가 정말 똑똑한 것 같아...
🌦
@ 잼메즈
이제 네가 누군지 보자.
2019년 1월 17일 오전 8:36
됐어, 우리 시작하자.
우선 컨트롤러 프로그램에 의존항 주입을 설정했는지 확인하십시오.이를 위해
Microsoft.Extensions.DependencyInjection
여기에 다음과 같은 설정 코드가 있다// Build configuration
configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetParent(AppContext.BaseDirectory).FullName)
.AddJsonFile("appsettings.json", false)
.Build();
// Boostrapping the app
var serviceProvider = new ServiceCollection()
.AddSingleton(configuration)
.AddSingleton<IWeatherstackService, WeatherstackService>()
.AddSingleton<IQuestionService, QuestionService>()
.AddSingleton<IUserInteractionService, UserInteractionService>()
.BuildServiceProvider();
var weatherApp = serviceProvider.GetService<IUserInteractionService>();
// Start the App
weatherApp.Start();
내 검수 기준은 사용자의 우편 번호를 받아서 몇 명의 사용자가 선택할 수 있는 미리 정의된 문제에 대답하는 것이다.이러한 문제는 주로 날씨와 관련이 있기 때문에 이 소규모 프로젝트에 대해서는 Weather Stack API를 사용할 것입니다.예, 게임플랜 coach
WeatherStackService
는 Weather Stack에 대한 http 요청을 처리합니다.나는 설탕 문법과 간단성을 제공하기 때문에 Flurl
http 요청 클라이언트로 사용한다.QuestionService
는 미리 정의된 질문과 검증 또는 실제 답변을 처리한다.그래서 만약 이것이 문제라고 가정한다면, 만약 비가 왔습니까?어느 정도에 이 서비스는 우리가 WeatherService
에서 얻은 정보에 따라 이 질문에 대답하려고 시도할 것이다.그리고 이 두 개는 주입될 것이다.
UserInteractionService
이 서비스는 힘든 일을 처리할 것이다.얘는 이렇게 보여요.private readonly IQuestionService _questionService;
private readonly IWeatherstackService _weatherstackService;
public UserInteractionService(IWeatherstackService weatherstackService,
IQuestionService questionService)
{
_weatherstackService = weatherstackService;
_questionService = questionService;
}
현재 우리는 ehem을 통해 이 두 서비스를 주입하고 있다UserInteractionService
이제 흥미로운 것은 의존성 약물을 주사했고 언제든지 사용할 수 있다는 것이다.우리는 쉽게 이런 방식으로 그것을 상상할 수 있다
모든 서비스의 성공 여부는 모든 서비스의 성공 여부에 달려 있고, 모든 서비스의 성공 여부는 모든 서비스의 성공 여부에 달려 있다.서비스를 서로 삽입하기만 하면 코드가 혼란스러워지고 복잡성이 지수급으로 늘어나기 때문이다.
graphviz
또는 PlantUML
등의 도구를 사용하여 모든 구성 요소를 시각화할 수 있습니다.계속해서 사용자가 우편 번호를 추가했다고 가정하면, Weather Stack 서비스는 날씨 정보를 가져와 POCO에 저장할 것을 요구할 것입니다.
private WeatherStackResponse AskZipCode()
{
....
....
var task = Task.Run(async () => await _weatherstackService.GetWeatherInfo(zipCode));
var result = task.Result;
if (result?.location != null)
{
Console.WriteLine(string.Format(Constants.ZipCodeValid,
result?.location.name, result?.location.country, result?.location.region));
return result;
}else{
....
}
}
Faily 멋있죠?우리는 그것을 설정할 필요가 없고, 심지어는 그것을 실례화할 필요도 없다.DI 모드의 장점 중 하나는 사물을 더욱 적절하게 격리할 수 있고, 반대로 코드를 더욱 쉽게 테스트할 수 있다는 것이다.공장의 방법, 구조기를 걱정할 필요가 없기 때문에 일을 훨씬 간단하게 할 수 있다.비록 다른 어떤 과도한 사용과 남용과 마찬가지로 그것도 해로울 수 있다.
이제 이곳으로 돌아가면 우리는 마침내 이 문제를 해결할 수 있다. 바로 한 문제에 대답하는 것이다
private void AskQuestion(WeatherStackResponse weatherInfo)
{
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine(Constants.SelectQuestionMessage);
var questions = _questionService.GetQuestions();
var selectedQuestion = UIUtils.PrintQuestion(questions);
// Generate Answer
var result = _questionService.AnswerQuestion(selectedQuestion, weatherInfo);
....
....
}
어쨌든 이것이 바로 그의 모습이다.데모
뒷생각
내 만담을 끝내기 전에 내가 지적하고 싶은 것은 정확하게 사용하면 DI가 매우 멋있다는 것이다.
최종 코드here를 볼 수 있습니다.
어쨌든 나는 너희들이 이것이 매우 재미있다고 느끼기를 바란다. 나는 이미 몇 년 동안 펜이나 키보드로 글을 쓰지 않았기 때문에 나는 좀 서툴렀지만, 나는 매우 즐겁게 놀았다.좋은 하루 되세요!
Reference
이 문제에 관하여(콘솔 응용 프로그램에서 의존 주입을 합니까?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/klawingco/playing-with-dependency-injection-in-a-console-app-3a4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)