我想在这里做一些平衡的行为。目前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