2017-09-02 19 views
0

我想在这里做一些平衡的行为。目前Azure WebJobs不支持.NET Core。与.NET核心和Ninject WebJobs中没有无参数构造错误

在一些帮助下,我创建了一个.NET Core控制台应用程序并使其作为WebJob工作。最重要的是,我正在尝试实施Ninject for DI。

代码编译得很好,但是当我运行它时,我得到了“没有无参数的构造函数是为此对象定义的”。错误 - 请参阅下文。

enter image description here

我可以在这里有点天青WebJobs难以估计的领土,.NET 2.0的核心和Ninject,但任何想法可能会导致什么呢?

顺便说一句,我有一个针对.NET Framework的WebJob运行相同的确切代码。我需要迁移到.NET Core 2.0,因为我使用的是面向.NET Core 2.0的类库。我也在这些类库中使用DI,这就是为什么我想使用Ninject将WebJob迁移到.NET Core 2.0的原因。

P.S.我正在使用Azure.WebJobs 3.0.0 beta2将我的.NET Core控制台应用程序转换为WebJobs。我还使用Ninject 3.2.2

UPDATE: 这是我的JobActivator

public class BrmJobActivator : IJobActivator 
    { 
     private readonly IKernel _container; 

     public BrmJobActivator(IKernel container) 
     { 
      _container = container; 
     } 

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

代码而这里的主要程序:

class Program 
    { 
     static readonly IKernel Kernel = new StandardKernel(); 
     static JobHostConfiguration config; 

     static void Main(string[] args) 
     { 
      Environment.SetEnvironmentVariable("AzureWebJobsDashboard", "MySettings"); 
      Environment.SetEnvironmentVariable("AzureWebJobsStorage", "MySettings"); 

      BootStrapIoc(); 

      config = new JobHostConfiguration(); 

      if (config.IsDevelopment) 
      { 
       config.UseDevelopmentSettings(); 
      } 

      var host = new JobHost(config); 
      host.RunAndBlock(); 
     } 

     private static void BootStrapIoc() 
     { 
      Kernel.Load(Assembly.GetExecutingAssembly()); 
      config = new JobHostConfiguration 
      { 
       JobActivator = new BrmJobActivator(Kernel) 
      }; 
     } 
    } 

更新2: 我现在得到以下错误。

enter image description here

引发此错误在下面的行 - 也看到第二图像。 return _container.Get<T>();

enter image description here

更新3: 下面是Functions.cs文件中的代码:

public class Functions 
{ 

    private static ISomeService1 _someService1; 
    private static ISomeService2 _someService2; 

    private static IConfiguration _configuration; 


    public Functions(ISomeService1 someService1, ISomeService2 someService2, IConfiguration configuration) 
    { 
     _someService1 = someService1; 
     _someService2 = someService2; 
     _configuration = configuration; 
    } 

    public async Task ProcessQueueMessage([QueueTrigger("my-brm-queue")] QueueMessage message, TextWriter log) 
    { 

     // Consume service 
     _someService1.DoSomething(message); 

    } 

} 

UPDATE 4: 下面是Ninject绑定类代码:

public class NinjectBindings : Ninject.Modules.NinjectModule 
{ 
    IConfiguration Configuration; 

    public override void Load() 
    { 
     // Bind to IConfiguration 
     var builder = new ConfigurationBuilder(); 
     builder.SetBasePath(Directory.GetCurrentDirectory()); 
     builder.AddJsonFile("appsettings.json"); 
     Configuration = builder.Build(); 
     Bind<IConfiguration>().ToMethod(ctx => { 
      return Configuration; 
     }); 

     // Create instances of clients 
     var docDbClient = new ClassLibrary1.DocumentDbClient(Configuration); 
     var tsClient = new ClassLibrary2.TableStorageClient(Configuration); 

     // Bind Services 
     Bind<ISomeService1>().To<SomeService1>(); 
     Bind<ISomeService2>().To<SomeService2>(); 

     // Bind Repositories 
     Bind<IRepository1>().To<Repository1>(); 
     Bind<IRepository2>().To<Repository2>(); 

    } 
} 
+0

您是如何配置Ninject?我们可以看看JobActivator的代码吗? Ninject似乎试图创建一个具有其他依赖项的依赖项的实例,但无法找到它们。你可以发布你的代码吗? – Thomas

+0

请参阅原文中的更新部分。谢谢。 – Sam

+0

你如何注册你的服务'ISomeService1','ISomeService2'和'IConfiguration'?因为你应该使用ninject注册这个服务? – Thomas

回答

0

实例化后来自的方法,您可以使用main方法重新实例化它。

只是删除您main方法这一行:

config = new JobHostConfiguration(); 
+0

很棒!谢谢。但是,我现在有这个错误:“无法从程序集'mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'加载类型'System.Runtime.Remoting.RemotingServices'”。 – Sam

+0

我更新了原始帖子以获取更多详细信息。请参阅UPDATE 2部分。谢谢。 – Sam

+0

请问您可以发布de触发功能的代码吗? – Thomas

相关问题