Nenhum erro de construtor sem parâmetros nos WebJobs com .NET Core e Ninject
Estou tentando fazer um pouco de equilíbrio aqui. Atualmente, os WebJobs do Azure não oferecem suporte ao .NET Core.
Com alguma ajuda, criei um aplicativo .NET Core Console e o fiz funcionar como um WebJob. Além disso, estou tentando implementar o Ninject for DI.
O código é compilado corretamente, mas quando eu o executo, recebo o "Nenhum construtor sem parâmetros está definido para este objeto". erro - veja abaixo.
Talvez eu esteja em um território desconhecido, com WebJobs do Azure, .NET Core 2.0 e Ninject, mas alguma idéia do que pode estar causando isso?
BTW, eu tinha o mesmo código exato em execução como um WebJob visando o .NET Framework. Eu precisava migrar para o .NET Core 2.0 porque estou usando bibliotecas de classes que têm como alvo o .NET Core 2.0. Também estou usando o DI nessas bibliotecas de classes e é por isso que estou tentando migrar meu WebJob para o .NET Core 2.0 usando o Ninject.
P.S. Estou usando o Azure.WebJobs 3.0.0 beta2 para converter meu aplicativo de console do .NET Core em WebJobs. Eu também estou usando o Ninject 3.2.2
UPDATE: Aqui está o meu código para o JobActivator
public class BrmJobActivator : IJobActivator
{
private readonly IKernel _container;
public BrmJobActivator(IKernel container)
{
_container = container;
}
public T CreateInstance<T>()
{
return _container.Get<T>();
}
}
E aqui está o principal programa:
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)
};
}
}
ATUALIZAÇÃO 2: Agora estou recebendo o seguinte erro.
Este erro é lançado na seguinte linha - veja também a segunda imagem.return _container.Get<T>();
ATUALIZAÇÃO 3: aqui está o código emFunctions.cs
Arquivo:
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);
}
}
ATUALIZAÇÃO 4: Aqui está o código na classe de ligações do 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>();
}
}