C#Ninject在从JSON反序列化时未注入
我正在编写一个简单的windows服务,我想使用依赖项注入。 在服务启动时,应用程序从文件中读取JSON字符串,并将其反序列化为对象。 JSON中的一个属性是“Bar”对象列表,我想在“Bar”构造函数中注入FooService。 我怀疑下面的代码可以工作,但“Bar”构造函数中的“service”为空 有人能告诉我,为什么这个代码不起作用,以及如何把它改成可以工作的吗 这是我的密码: Ninject.csC#Ninject在从JSON反序列化时未注入,c#,service,json.net,ninject,.net-framework-4.8,C#,Service,Json.net,Ninject,.net Framework 4.8,我正在编写一个简单的windows服务,我想使用依赖项注入。 在服务启动时,应用程序从文件中读取JSON字符串,并将其反序列化为对象。 JSON中的一个属性是“Bar”对象列表,我想在“Bar”构造函数中注入FooService。 我怀疑下面的代码可以工作,但“Bar”构造函数中的“service”为空 有人能告诉我,为什么这个代码不起作用,以及如何把它改成可以工作的吗 这是我的密码: Ninject.cs class NinjectBindings : Ninject.Modules.Ninj
class NinjectBindings : Ninject.Modules.NinjectModule
{
public override void Load()
{
Bind<IFooService>().To<FooService>();
Bind<Bar>().ToSelf().WithConstructorArgument("service", ctx => ctx.Kernel.Get<IFooService>());
}
}
从NinjectBindings中删除Bind,并将SerializationMethod更改为:
var json = JsonConvert.DeserializeObject<Deserializator>("{}", new
JsonSerializerSettings()
{
ContractResolver = new NinjectResolver(new StandardKernel(new NinjectBindings()))
});
var json=JsonConvert.DeserializeObject(“{}”,新建)
JsonSerializerSettings()
{
ContractResolver=新的NinjectResolver(新的标准内核(新的NinjectBindings()))
});
现在,它起作用了
public class Bar {
private readonly IFooService _fooService;
public Bar (IFooService service){
// here service is null
using (var kernel = new StandardKernel(new NinjectBindings())){
var kernelService = kernel.Get<IFooService>();
// here kernelService is NOT null
}
}
}
class NinjectResolver : DefaultContractResolver
{
private readonly IKernel _container;
public NinjectResolver(IKernel container)
{
_container = container;
}
protected override JsonObjectContract CreateObjectContract(Type objectType)
{
if (_container.TryGet(objectType) != null)
{
JsonObjectContract contract = ResolveContact(objectType);
contract.DefaultCreator = () => _container.Get(objectType);
return contract;
}
return base.CreateObjectContract(objectType);
}
private JsonObjectContract ResolveContact(Type objectType)
{
return base.CreateObjectContract(objectType);
}
}
var json = JsonConvert.DeserializeObject<Deserializator>("{}", new
JsonSerializerSettings()
{
ContractResolver = new NinjectResolver(new StandardKernel(new NinjectBindings()))
});