我想在這裏做一些平衡的行爲。目前Azure WebJobs不支持.NET Core。與.NET核心和Ninject WebJobs中沒有無參數構造錯誤
在一些幫助下,我創建了一個.NET Core控制檯應用程序並使其作爲WebJob工作。最重要的是,我正在嘗試實施Ninject for DI。
代碼編譯得很好,但是當我運行它時,我得到了「沒有無參數的構造函數是爲此對象定義的」。錯誤 - 請參閱下文。
我可以在這裏有點天青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: 我現在得到以下錯誤。
引發此錯誤在下面的行 - 也看到第二圖像。 return _container.Get<T>();
更新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>();
}
}
您是如何配置Ninject?我們可以看看JobActivator的代碼嗎? Ninject似乎試圖創建一個具有其他依賴項的依賴項的實例,但無法找到它們。你可以發佈你的代碼嗎? – Thomas
請參閱原文中的更新部分。謝謝。 – Sam
你如何註冊你的服務'ISomeService1','ISomeService2'和'IConfiguration'?因爲你應該使用ninject註冊這個服務? – Thomas