Tidy up - Unused Project and Nuget package reference using Visual Studio 2019

If you are a Developer/Architect using Visual Studio as IDE for your development activities, this blog post will be of your interest. During the Ignite 2021 conference, Microsoft released Visual Studio 2019 v16.9 and v16.10 Preview 1. As part of version 16.10 Preview 1, one of the cool features they introduced is to "Remove Unused References..." for any Projects and Nuget packages that are not in use. At the time of writing this blog post, we have Visual Studio Version 16.10.0 (official release) which includes this new feature.  As part of development, we generally get carried away and introduce new Nuget package references to your project and add new references to your Projects. By the end of development, you will not be 100% sure which are not being referenced and unused which means you will leave those unused project references in your application. Now you might be wondering what's the big deal in it since it doesn't harm. The advantage of removing unused project r

Azure WebJob using .NET Core


Background

WebJobs is a feature of Azure App Service that enables you to run a program or script in the same context as a web app, API app, or mobile app. There is no additional cost to use WebJobs if you are running under the existing web app.
WebJobs is not something new to Azure or .NET , there’s even a default Azure WebJob template in VS 2017 but for .NET framework. No VS template exists for Azure WebJob in .NET Core but that doesn’t stop us using .NET Core for WebJob. Creating WebJob in .NET Core is not hard but need to incorporate certain tweaks using HostBuilder and WebJobs SDK version 3.x. I have tried to incorporate end to end process with sample code snippet for Timer Trigger using .NET Core.

.NET Core with WebJobs SDK versions 3.x

Version 3.x adds support for .NET Core. Visual Studio tooling for .NET Core (3.x) projects differs from tooling for .NET Framework (2.x) projects. With 2.x you can still implement in .NET Core but with 3.x it simplifies and we can get some core benefits of .NET Core like DI, IHost, logging etc. In version 2.x, you use the JobHost object where uou create a host instance in your code and write code to customize its behavior.

Version 2.x

static void Main(string[] args)
{
    var _storageConn = ConfigurationManager
        .ConnectionStrings["MyStorageConnection"].ConnectionString;

    
    JobHostConfiguration config = new JobHostConfiguration();
    config.StorageConnectionString = _storageConn;
    //config.DashboardConnectionString = _dashboardConn;
    JobHost host = new JobHost(config);
    host.RunAndBlock();
}

Version 3.x

static void Main()
{
    var builder = new HostBuilder();
    builder.UseEnvironment("development");
    builder.ConfigureWebJobs(b =>
            {
                b.AddAzureStorageCoreServices();
            });
    var host = builder.Build();
    using (host)
    {
        host.Run();
    }
}

Project setup in Visual Studio 2019


To start development of an Azure WebJob, you need to create a new .NET Core Console Application.

To make this project ready for Azure WebJob implemenation we need to install few of Nuget packages.
Install-Package Microsoft.Azure.WebJobs
Install-Package Microsoft.Azure.WebJobs.Extensions  
Install-Package Microsoft.Azure.WebJobs.Extensions.Storage
Install-Package Microsoft.Extensions.Hosting


Add appsettings.json file with basic configuration of the Webjob and file should contain connection string of the storage account of use

{
  "ConnectionStrings": {
    "AzureWebJobsStorage": "<<Azure Storage Account connection string>>"
  }
}

Startup changes

As part of 3.x SDK we need to initialise the WebJob host system and some basic configuration. As part of demo we are demonstrating TimerTrigger for which we have built in extension method named “AddTimers” which needs to be added as part of ConfigureWebJobs. ConfigureServices is where we configure the services we want our application to run, registering services with the ServiceCollection. Registration is performed using extension methods on the ServiceCollection and once complete, enabling DI in our application.

  public static async Task Main()
        {
            var builder = new HostBuilder()
                .UseEnvironment("Development")
                .ConfigureWebJobs(b =>
                {
                    b.AddAzureStorageCoreServices()
                        .AddTimers();
                })
                .ConfigureAppConfiguration(config =>
                {
                    config.AddJsonFile("appsettings.json", optional: true);
                    config.AddEnvironmentVariables();
                })
                .ConfigureLogging((context, logging) =>
                {
                    logging.AddConfiguration(context.Configuration.GetSection("Logging"));
                    logging.AddConsole();

                })
                .ConfigureServices((context, services) =>
                {
                    //If you want to read configuration value from Appsetting json file.
                    var configuration = context.Configuration;
                    // add some sample services to demonstrate job class DI
                    services.AddScoped<IDemo, Demo>();
                })
                .UseConsoleLifetime();

            var host = builder.Build();
            using (host)
            {
                await host.RunAsync();
            }
        }

Triggers

Timer trigger function snippet can be found below
public  class Functions
    {
        private readonly IDemo _demo;

        public Functions(IDemo demo)
        {
            _demo = demo;
        }

        public async Task TimerTrigger([TimerTrigger("0 */5 * * * *", RunOnStartup = true)] TimerInfo timerInfo, CancellationToken cancellationToken)
        {
            //Some logic goes here...
            _demo.SomeAction();
        }
    }

If we see in the trigger function makes use of DI (Demo object) injected as part of constructor.


Comments

Popular posts from this blog

Tidy up - Unused Project and Nuget package reference using Visual Studio 2019

Swagger UI for Azure Function v2 & v3 APIs

Authenticate Azure Functions - API Keys