微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

依赖注入 – 依赖注入Ninject with WebJobs for DbContext in static function scope

有没有办法挂钩到WebJobs函数执行,所以我们可以为每个函数设置一个范围?像这样的东西:

kernel.Bind< MyDbContext>()ToSelf()InWebJobFunctionScope().;

我想使用Ninject的InScope(),但我不知道在哪里可以找到类似于静态HttpContext.Current的内容,但是对于当前正在运行的WebJob.

解决方法

我知道这是一个旧的,但我有同样的戏剧.从更新版本的Web作业开始,您可以使用实例和实例方法,并传入自定义IJobActivator实例.这简直太容易了.

它与Ninject完美配合.我没见过任何Ninject的例子,所以……

public class MyJobActivator : IJobActivator
{
    protected readonly IKernel _kernel;

    public MyJobActivator(IKernel kernel)
    {
        _kernel = kernel;
    }

    public T CreateInstance<T>()
    {
        return _kernel.Get<T>();
    }
}


public class MyBindings : NinjectModule
{
    public override void Load()
    {     
        Bind(typeof(DbContext)).To(typeof(MyEntities));
    }
}

class Program
{        
    static void Main()
    {
        using (IKernel kernel = new StandardKernel(new MyBindings()))
        {
            var jobHostConfiguration = new JobHostConfiguration
            {
                JobActivator = new MyJobActivator(kernel)
            };

            var host = new JobHost(jobHostConfiguration);

            // The following code will invoke a function called ManualTrigger and 
            // pass in data (value in this case) to the function
            host.Call(typeof(Reminders).getmethod("ManualTrigger"),new { value = 20 });
        }
    }
}


public class Reminders
{
    private readonly IMyService _myService;

    public Reminders(IMyService myService)
    {
        _myService = myService;
    }

    // This function will be triggered based on the schedule you have set for this WebJob
    // This function will enqueue a message on an Azure Queue called queue
    [NoAutomaticTrigger]
    public async Task ManualTrigger(TextWriter log,int value,TextWriter logger)
    {
        try
        {   
            // process the notification request
            await _myService.FindAndSendReminders();
            await _myService.SaveChangesAsync();
        }
        catch (Exception e)
        {
            logger.WriteLine(e.Message);
            Console.WriteLine(e.Message);
            throw;
        }
    }
}

编辑:除了上面我已经看到最近了解到你可能不需要使用host.Call(typeof(Reminders).getmethod(“ManualTrigger”),至少对于连续的web作业.

您只需使您的Functions类非静态并添加注入构造函数,然后使您的处理方法不是静态的.这是下面的图解.

public class Program
{        
    static void Main()
    {
        using (IKernel kernel = new StandardKernel(new MyBindings()))
        {
            var jobHostConfiguration = new JobHostConfiguration
            {
                JobActivator = new MyJobActivator(kernel)
            };

            var host = new JobHost(jobHostConfiguration);

            // The following code ensures that the WebJob will be running continuously
            host.RunAndBlock();
        }
    }
}


public class Functions
{
    private readonly IMyService _myService;

    public Functions(IMyService myService)
    {
        _myService = myService;
    }        

    public async Task ProcessReminders([QueueTrigger("reminder-requests")] string notificationMessage,TextWriter logger)
    {
        try
        {   
            // process the notification request
            await _myService.FindAndSendReminders();
            await _myService.SaveChangesAsync();
        }
        catch (Exception e)
        {
            logger.WriteLine(e.Message);
            Console.WriteLine(e.Message);
            throw;
        }
    }
}

我从我发现的Autofac文章中调整了原始代码

http://www.jerriepelser.com/blog/dedependency-injection-with-autofac-and-webjobs

也可以看看

Dependency injection using Azure WebJobs SDK?

对于连续的webjobs

http://www.ryansouthgate.com/2016/05/10/azure-webjobs-and-dependency-injection/

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐