解决.net核心控制台应用程序中参考程序集中的依赖项

时间:2019-02-07 13:15:53

标签: dependency-injection .net-core

我正在测试一个小型控制台应用程序,该应用程序将用于基于Quartz队列显示信息,而且我正在努力解决要在参考程序集中解析的依赖项。

我的控制台应用程序在一个名为App.Monitor的程序集中引用了一个与IUtilities相关的EventData类,由于生成了代码,所以对它进行了部分修改,并且我们将这些属性/方法添加到此类中具体原因...

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();
}

然后,在控制台应用程序中的某个位置,我正在执行一个调用,该调用应在实用程序中初始化此依赖关系,而不会这样做,IUtilities始终为NULL:

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; }
}

EventData(生成代码)

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

EventData(具有自定义逻辑的部分功能)

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;
    }
}

1 个答案:

答案 0 :(得分:1)

在控制台中,您需要接管框架的角色并获取依赖关系并调用所需的成员

var utility = provider.GetRequiredService<IUtilities>();

var list = JsonConvert.DeserializeObject<List<QuartzJobs>>(json);    

var stamp = utility?.Epoch(list[0].EventData.Timestamp);

那是因为容器/提供者不是解决EventData的那个,所以没有注入任何东西。

相关问题