2017-09-02 32 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

相關問題