С # 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()))
        });

А теперь - работает.

0 ответов

Другие вопросы по тегам