С # Ninject не внедряется при десериализации из JSON
Я пишу простую службу Windows и хочу использовать внедрение зависимостей. При запуске службы приложение считывает строку JSON из файла и десериализует ее в объект. Одно из свойств в JSON - это список объектов "Бар", а в конструктор "Бар" я хочу внедрить FooService. Я подозревал, что следующий код будет работать, но "service" в конструкторе "Bar" имеет значение null.
Может ли кто-нибудь объяснить мне, почему этот код не работает и как сделать так, чтобы он работал?
Это мой код:
NinjectBinding.cs
class NinjectBindings : Ninject.Modules.NinjectModule
{
public override void Load()
{
Bind<IFooService>().To<FooService>();
Bind<Bar>().ToSelf().WithConstructorArgument("service", ctx => ctx.Kernel.Get<IFooService>());
}
}
Deserializator.cs
internal class Deserializator
{
internal static void GetFilePaths()
{
var json = JsonConvert.DeserializeObject<Deserializator>("{}");///... Read from JSON File
}
public List<Bar> BarList { get; set; }
}
Bar.cs
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
}
}
}
ОБНОВИТЬ
Я нашел решение на https://www.newtonsoft.com/json/help/html/DeserializeWithDependencyInjection.htm
Я добавил NinjectResolver.cs
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);
}
}
удалите Bind из NinjectBindings и измените SerializationMethod на:
var json = JsonConvert.DeserializeObject<Deserializator>("{}", new
JsonSerializerSettings()
{
ContractResolver = new NinjectResolver(new StandardKernel(new NinjectBindings()))
});
А теперь - работает.