콘솔 응용 프로그램에서 의존 주입을 합니까?

11263 단어 csharpprogramming
며칠 전에 날씨에 대한 질문을 하기 위해 컨트롤러 프로그램을 만들어 달라는 요청을 받았습니다.이것은 매우 표준적인 easy peasy 컨트롤러 프로그램입니다. 만약 당신이 그것을 느끼고 상태에 있다면, 1시간, 심지어 30분 안에 제거할 수 있습니다.
그러나 그것은 무미건조하기 때문에 나는 최근 몇 년 동안 논쟁의 모델인 주입에 의존하여 그것을 가지고 놀기로 결정했다.왜 안 해요?
그렇다면 의존 주입은 무엇일까?
응, 이건 상당히 책벌레야. 하지만 농구 팬으로서 나도 나만의 독특한 해석 방식이 있어. (완전히 틀린 롤이라면 마음대로 공격해)
상상해 보세요. 헬스장에 가서 슛을 해요. 보통 슛을 하고 자신의 공을 튕기고 심지어 공을 쫓아다니다가 당신의 위치로 돌아오면 슛을 할 수 있고 이 과정을 다시 반복할 수 있어요.
이제 의존 주입에서 당신이 해야 할 일은 공을 던지는 것이다. 공이 필요할 때, 공이 자동으로 당신에게 전달되기 때문이다.
지금 컴파일러가 정말 똑똑한 것 같아...


🌦
@ 잼메즈

이제 네가 누군지 보자.
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를 사용할 것입니다.
예, 게임플랜 coachWeatherStackService는 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가 매우 멋있다는 것이다.
  • 건조는 쉽게 수행할 수 있습니다.책임에 경의를 표합니다!
  • 테스트 가능한 격리 코드 및 그 이상.
  • 유지 보수가 상당히 쉬워요?(주관적, 내게는 그렇다)
  • 그러나 비록 그것은 매우 좋지만, 그것은 모든 사람에게 적합하지 않다.
  • 더 많은 인터페이스, 클래스 등을 작성해야 합니다
  • 이것은 복잡성을 증가시켰다. 주로 가시화 의존 관계 트리가 없으면 서비스를 서로 연결할 뿐이다.
  • 와 작은 가격으로 일상 지출을 지불하는 표현.(지금의 기계에 대해 나는 그것이 이미 사람들의 주목을 끌기에 충분하다고 생각하지만,seeksers 여사
  • 에 대해서는
    최종 코드here를 볼 수 있습니다.
    어쨌든 나는 너희들이 이것이 매우 재미있다고 느끼기를 바란다. 나는 이미 몇 년 동안 펜이나 키보드로 글을 쓰지 않았기 때문에 나는 좀 서툴렀지만, 나는 매우 즐겁게 놀았다.좋은 하루 되세요!

    좋은 웹페이지 즐겨찾기