код.
аюсь сделать немного балансировки здесь. В настоящее время веб-задания Azure не поддерживают .NET Core.
С некоторой помощью я создал консольное приложение .NET Core и заставил его работать как WebJob. Кроме того, я пытаюсь реализовать Ninject для DI.
Код компилируется нормально, но когда я его запускаю, я получаю сообщение: «Для этого объекта не определен конструктор без параметров». ошибка - см. ниже.
Может быть, я нахожусь на некоторой неисследованной территории с Azure WebJobs, .NET Core 2.0 и Ninject, но есть идеи, что может быть причиной этого?
Кстати, у меня был точно такой же код, что и для WebJob, нацеленной на .NET Framework. Мне нужно было перейти на .NET Core 2.0, потому что я использую библиотеки классов, предназначенные для .NET Core 2.0. Я также использую DI в этих библиотеках классов, поэтому пытаюсь перенести свой WebJob на .NET Core 2.0 с помощью Ninject.
Постскриптум Я использую бета2 Azure.WebJobs 3.0.0 для преобразования моего консольного приложения .NET Core в WebJobs. Я также использую Ninject 3.2.2
ОБНОВЛЕНИЕ: вот мой код для 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);
}
}
ОБНОВЛЕНИЕ 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>();
}
}