11// Copyright (c) 2020 Jon P Smith, GitHub: JonPSmith, web: http://www.thereformedprogrammer.net/
22// Licensed under MIT license. See License.txt in the project root for license information.
33
4+ using System ;
45using System . Collections . Generic ;
56using System . Linq ;
7+ using System . Runtime . InteropServices . ComTypes ;
68using DataLayer . BookApp . EfCode ;
79using Microsoft . Data . Sqlite ;
810using Microsoft . EntityFrameworkCore ;
11+ using Microsoft . Extensions . DependencyInjection ;
912using Microsoft . Extensions . Logging ;
1013using Test . Helpers ;
1114using TestSupport . EfHelpers ;
@@ -24,6 +27,118 @@ public TestMyLoggerProviderActionOut(ITestOutputHelper output)
2427 _output = output ;
2528 }
2629
30+ class MyService
31+ {
32+ private readonly ILogger _logger ;
33+
34+ public MyService ( ILogger < MyService > logger )
35+ {
36+ _logger = logger ;
37+ }
38+
39+ public void AddInfoLog ( )
40+ {
41+ _logger . LogInformation ( "This is a log" ) ;
42+ }
43+ }
44+
45+ [ Fact ]
46+ public void TestDependencyInjectionFailIfNoLogger ( )
47+ {
48+ //SETUP
49+ var services = new ServiceCollection ( ) ;
50+ services . AddSingleton < MyService > ( ) ;
51+
52+ //ATTEMPT
53+ var serviceProvider = services . BuildServiceProvider ( ) ;
54+ var ex = Assert . Throws < InvalidOperationException > ( ( ) => serviceProvider . GetService < MyService > ( ) ) ;
55+
56+ //VERIFY
57+ ex . Message . ShouldStartWith ( "Unable to resolve service" ) ;
58+ }
59+
60+ [ Fact ]
61+ public void TestAddLoggerInDependencyInjection ( )
62+ {
63+ //SETUP
64+ var services = new ServiceCollection ( ) ;
65+ services . AddTransient < MyService > ( ) ;
66+ services . AddLogging ( ) ;
67+
68+ //ATTEMPT
69+ var serviceProvider = services . BuildServiceProvider ( ) ;
70+ var myServiceDI = serviceProvider . GetService < MyService > ( ) ;
71+
72+ //VERIFY
73+ myServiceDI . ShouldNotBeNull ( ) ;
74+ myServiceDI . AddInfoLog ( ) ;
75+ }
76+
77+ [ Fact ]
78+ public void TestAddingLoggerInDependencyInjection ( )
79+ {
80+ //SETUP
81+ var logs = new List < LogOutput > ( ) ;
82+ var services = new ServiceCollection ( ) ;
83+ services . AddTransient < MyService > ( ) ;
84+ services . AddSingleton < ILogger < MyService > > ( x =>
85+ new LoggerFactory (
86+ new [ ] { new MyLoggerProviderActionOut ( l => logs . Add ( l ) ) } )
87+ . CreateLogger < MyService > ( ) ) ;
88+
89+ //ATTEMPT
90+ var serviceProvider = services . BuildServiceProvider ( ) ;
91+ var myServiceDI = serviceProvider . GetRequiredService < MyService > ( ) ;
92+
93+ //VERIFY
94+ logs . Count . ShouldEqual ( 0 ) ;
95+ myServiceDI . AddInfoLog ( ) ;
96+ logs . Count . ShouldEqual ( 1 ) ;
97+ _output . WriteLine ( logs . Single ( ) . ToString ( ) ) ;
98+ }
99+
100+ class MyOtherService
101+ {
102+ private readonly ILogger _logger ;
103+
104+ public MyOtherService ( ILogger < MyOtherService > logger )
105+ {
106+ _logger = logger ;
107+ }
108+
109+ public void AddInfoLog ( )
110+ {
111+ _logger . LogInformation ( "This is a log" ) ;
112+ }
113+ }
114+
115+ [ Fact ]
116+ public void TestAddingLoggerInDependencyInjectionWithAddLogging ( )
117+ {
118+ //SETUP
119+ var logs = new List < LogOutput > ( ) ;
120+ var services = new ServiceCollection ( ) ;
121+ services . AddLogging ( ) ;
122+ services . AddTransient < MyService > ( ) ;
123+ services . AddTransient < MyOtherService > ( ) ;
124+ services . AddSingleton < ILogger < MyService > > ( x =>
125+ new LoggerFactory (
126+ new [ ] { new MyLoggerProviderActionOut ( l => logs . Add ( l ) ) } )
127+ . CreateLogger < MyService > ( ) ) ;
128+
129+ //ATTEMPT
130+ var serviceProvider = services . BuildServiceProvider ( ) ;
131+ var myServiceDI = serviceProvider . GetRequiredService < MyService > ( ) ;
132+ var myOtherService = serviceProvider . GetRequiredService < MyOtherService > ( ) ;
133+
134+ //VERIFY
135+ logs . Count . ShouldEqual ( 0 ) ;
136+ myServiceDI . AddInfoLog ( ) ;
137+ logs . Count . ShouldEqual ( 1 ) ;
138+ _output . WriteLine ( logs . Single ( ) . ToString ( ) ) ;
139+ myOtherService . AddInfoLog ( ) ;
140+ }
141+
27142 [ Fact ]
28143 public void TestDecodeMessageNotSensitiveLogging ( )
29144 {
0 commit comments