使用依赖项注入dotnet内核在应用程序上运行Singleton实例方法启动

时间:2019-03-01 17:53:39

标签: c# dependency-injection .net-core

我有一个带有Queue类的webapi .NET Core应用程序,该应用程序不断循环遍历List<Item>对象,其中Item是数据模型的包装,并包含一些元数据异步执行一些任务。这个Queue类需要在控制器中可以访问,并且我已经正确地在DI框架中注册了它。我的问题是,我需要使BeginProcessing方法在应用程序启动时开始运行,并且传递给控制器​​的实例必须与运行该方法的实例相同,并且我不确定最好的方法。任何帮助表示赞赏。此上下文中未包含的所有内容(例如Program等都仍然是默认设置。

请参阅下文。

Queue.cs:

public class Queue : IQueue
{
    public List<Item> Items { get; set; }

    public void BeginProcessing()
    {
        while(true)
        {
            if (!(Items.Count < 1))
            {
                Item Item = Items[0];
                if (!Item.Push())
                {
                    Console.WriteLine("Generic Error Message, not final implementation.");
                }
                Items.Remove(Item);
            }
        }
    }
}

Item.cs

public class Item
{
    public SomeDataModel Data { get; set; } 
    public string Topic { get; set; }
    public string Timestamp { get; set; }

    public Item(SomeDataModel newData, string newTopic, string newTimestamp)
    {
        Data = newData;
        Topic = newTopic;
        Timestamp = newTimestamp;
    }

    public bool Push()
    {
        Producer p = new Producer("identifier");
        return p.Ingest(Data);
    }
}

Startup.cs

public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

        services.AddSingleton<IQueue, Queue>();
    }

2 个答案:

答案 0 :(得分:1)

您应该创建一些后台工作程序来处理队列线程。

x = x.__iadd__(y)

这将使调用线程陷入无限循环。尝试使用任务或背景工作者。您甚至可以将其放入自己的队列中,以将其从主应用程序中隐藏起来。

要从开始启动BeginProcessing,请获取构建的容器并查询IQueue。调用IQueue.BeginProcessing()并继续正常启动。如果一切正常,只要将IQueue注入到控制器中,它就会与您开始BeginProcessing时使用的相同,并且您应该可以在控制器上下文中访问它

答案 1 :(得分:0)

我最终找到了我的用例的解决方案,而不必依赖荒谬的抽象或.NET框架中其他晦涩的部分。无论是最佳实践,我都不知道。但是它可以正常工作并满足我的需求,最终,这就是每个人真正想要的。

我的解决方案:

在DI框架中注册Singleton,将依赖项注入Configure方法中,然后将处理方法启动到另一个线程中。

Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    services.AddSingleton<IQueue, Queue>();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env, IQueue queue)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseHsts();
    }

    Task.Run(() => queue.BeginProcessing());

    app.UseHttpsRedirection();
    app.UseMvc();
}