代码之家  ›  专栏  ›  技术社区  ›  JadedEric

解析.NET核心控制台应用程序中引用程序集中的依赖项

  •  1
  • JadedEric  · 技术社区  · 6 年前

    我正在测试一个小控制台应用程序,它将用于显示基于Quartz队列的信息,我正在努力解决在引用程序集中的依赖关系。

    我的控制台应用程序引用了一个EventData类,它依赖于一个名为app.monitor的程序集中的iutilities,它是部分的,因为基础是代码生成的,我们出于特定的原因将这些属性/方法添加到类中…

    public partial class EventData
    {
        private readonly IUtilities _utilities;
    
        [JsonIgnore]
        public DateTime? DateStamp => _utilities?.Epoch(Timestamp);
    
        [JsonIgnore]
        public EventType EventType =>
            (EventType)EventType.Parse(typeof(EventType), (CultureInfo.CurrentCulture.TextInfo.ToTitleCase(Event)));
    
        public EventData(IUtilities utitlies)
        {
            _utilities = utitlies;
        }
    }
    

    在控制台应用程序中,我根据网络上的各种示例设置了.NET核心依赖项注入,代码供参考:

    public IServiceProvider BuildDependencies()
    {
        services.AddTransient<IHttpContextAccessor, HttpContextAccessor>();
        services.AddTransient<IUtilities, Utilities>();
    
        return services.BuildServiceProvider();
    }
    

    然后,在控制台应用程序中的某个地方,我正在执行一个调用,该调用应该在实用程序中启动这种依赖关系,但它不这样做,i utilities始终为空:

    provider.GetRequiredService<IUtilities>(); // thought this would fix it...
    
    var list = JsonConvert.DeserializeObject<List<QuartzJobs>>(json);    
    var stamp = list[0].EventData.DateStamp;
    

    更新

    QuartzJobs(代码生成)

    public class QuartzJobs 
    {
        [JsonProperty("event-data")]
        public EventData EventData { get; set; }
    }
    

    事件数据(代码生成)

    public partial class EventData
    {
        [JsonProperty("timestamp")]
        public double Timestamp { get; set; }
    }
    

    事件数据(部分使用自定义逻辑)

    公共分部类事件数据
    {
    专用只读实用程序;
    
    [ JSONNECT ]
    公共日期时间?日期戳=>\u实用程序?.epoch(时间戳);
    
    [ JSONNECT ]
    公共事件类型EventType=>
    (eventtype)eventtype.parse(typeof(eventtype),(cultureinfo.currentulture.textinfo.toitlecase(event));
    
    公共事件数据(实用程序)
    {
    _公用设施=Utitlies;
    }
    }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Nkosi    6 年前

    var utility = provider.GetRequiredService<IUtilities>();
    
    var list = JsonConvert.DeserializeObject<List<QuartzJobs>>(json);    
    
    var stamp = utility?.Epoch(list[0].EventData.Timestamp);
    

    EventData