andrew.fox
andrew.fox

Reputation: 7933

Blob path name provider for WebJob trigger

I have a following test code that is placed inside a WebJob project. It is triggered after any blob is created (or changed) inside "cBinary/test1/" storage account.

The code works.

public class Triggers
{
    public void OnBlobCreated(
        [BlobTrigger("cBinary/test1/{name}")] Stream blob, 
        [Blob("cData/test3/{name}.txt")] out string output)
    {
       output = DateTime.Now.ToString();
    }
}

The question is: how to get rid of ugly hard-coded const string "cBinary/test1/" and ""cData/test3/"?

Hard-coding is one problem, but I need to create and maintain couple of such strings (blob directories) that are created dynamically - depend of supported types. What's more - I need this string value in couple of places, I don't want to duplicate it.

I would like them to be placed in some kind of configuration provider that builds the blob path string depending on some enum, for instance.

How to do it?

Upvotes: 3

Views: 666

Answers (1)

lopezbertoni
lopezbertoni

Reputation: 3641

You can implement INameResolver to resolve QueueNames and BlobNames dynamically. You can add the logic to resolve the name there. Below is some sample code.

public class BlobNameResolver : INameResolver
{
    public string Resolve(string name)
    {
        if (name == "blobNameKey")
        {
            //Do whatever you want to do to get the dynamic name
            return "the name of the blob container";
        }
    }
}

And then you need to hook it up in Program.cs

class Program
{
    // Please set the following connection strings in app.config for this WebJob to run:
    // AzureWebJobsDashboard and AzureWebJobsStorage
    static void Main()
    {
        //Configure JobHost
        var storageConnectionString = "your connection string";
        //Hook up the NameResolver
        var config = new JobHostConfiguration(storageConnectionString) { NameResolver = new BlobNameResolver() };

        config.Queues.BatchSize = 32;

        //Pass configuration to JobJost
        var host = new JobHost(config);
        // The following code ensures that the WebJob will be running continuously
        host.RunAndBlock();
    }
}

Finally in Functions.cs

public class Functions
{
    public async Task ProcessBlob([BlobTrigger("%blobNameKey%")] Stream blob)
    {
        //Do work here
    }
}

There's some more information here.

Hope this helps.

Upvotes: 7

Related Questions