我正在使用.Net-Core学习C#。我是依赖注射的新手。我试图了解在测试Blazor Web应用程序中使用的类库时如何注入ILogger<T>
。
我创建了一个 MotionDetectionConverter 类,该类将ILogger<T>
注入构造函数中。
在该类的 Read 方法中,我实例化了另一个帮助器类 JsonVisitor 。如果要向 JsonVisitor 类添加日志记录功能,则可以向构造函数添加ILogger<JsonVisitor>
参数。但是,我不明白该如何注入? MotionDetectionConverter Read 方法是否应执行依存性检测?如何进行测试?
MotionDetectionConverter类
internal sealed class MotionDetectionConverter : JsonConverter<MotionDetection>
{
private readonly ILogger _log;
public MotionDetectionConverter(ILogger<MotionDetectionConverter> logger)
{
_log = logger;
}
public override bool CanConvert(Type typeToConvert)
{
_log.LogInformation("CanConvert {} => {}", typeToConvert.ToString(), (typeToConvert == typeof(MotionDetection)));
return (typeToConvert == typeof(MotionDetection));
}
public override MotionDetection Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
JsonVisitor visitor = new JsonVisitor(ref reader, options);
Detection details = new Detection();
details.accept(visitor);
return details.ToModel();
}
public override void Write(Utf8JsonWriter writer, MotionDetection motionDetection, JsonSerializerOptions options) =>
throw new NotImplementedException("Serialization of MotionDetection objects is not implemented");
}
JsonVisitor类
internal ref struct JsonVisitor
{
// private ILogger _log;
private Utf8JsonReader _reader;
private JsonSerializerOptions _options;
#region Constructor
public JsonVisitor(ref Utf8JsonReader reader, JsonSerializerOptions options) // ILogger<JsonVisitor> log)
{
// _log = log;
_reader = reader;
_options = options;
}
#endregion
public void DeserializeMotionInfo(Details target)
{
if (_reader.TokenType != JsonTokenType.StartObject)
throw new NotSupportedException();
target.plug = JSON.ReadStringProperty(ref _reader, MotionInfoPropertyNames.Plug);
target.name = JSON.ReadStringProperty(ref _reader, MotionInfoPropertyNames.Name);
target.reason = JSON.ReadStringProperty(ref _reader, MotionInfoPropertyNames.Reason);
target.img = JSON.ReadStringProperty(ref _reader, MotionInfoPropertyNames.Img);
target.imgHeight = JSON.ReadIntProperty(ref _reader, MotionInfoPropertyNames.ImgHeight);
target.imgWidth = JSON.ReadIntProperty(ref _reader, MotionInfoPropertyNames.ImgWidth);
target.time = JSON.ReadDateTimeOffsetProperty(ref _reader, MotionInfoPropertyNames.Time);
_reader.Read();
if (_reader.TokenType != JsonTokenType.EndObject)
throw new JsonException();
// _log.LogInformation(string.Format("Completed Read operation for MotionInfo object, token type is now => {0}", reader.TokenType));
}
}