Библиотеки и фрейморки

Использование Ninject

Некоторые аспекты использования Ninject.

Ошибка FileNotFoundException

Ошибка FileNotFoundException может возникать когда приложение не может найти библиотеку Ninject.dll (например, ее забыли скопировать в папку приложения).

Ninject + Newtonsoft.Json: десериализация в интерфейсы

using System;
using Newtonsoft.Json.Serialization;
using Ninject;


/// <summary>
/// Ninject contract resolver
/// </summary>
public class NinjectContractResolver : DefaultContractResolver
{
	/// <summary>
	/// The <see cref="IKernel"/>.
	/// </summary>
	private readonly IKernel _kernel;


	/// <summary>
	/// Initializes a new instance of the <see cref="NinjectContractResolver"/> 
	/// class.
	/// </summary>
	/// <param name="kernel">The <see cref="IKernel"/>.</param>
	public NinjectContractResolver(IKernel kernel)
	{
		_kernel = kernel;
	}


	/// <summary>
	/// Resolve contract by Ninject kernel.
	/// </summary>
	/// <param name="objectType">The contract type.</param>
	/// <returns>The <see cref="JsonObjectContract"/>.</returns>
	protected override JsonObjectContract CreateObjectContract(Type objectType)
	{
		var contract = base.CreateObjectContract(objectType);
		contract.DefaultCreator = () => _kernel.Get(objectType);
		return contract;
	}
}
var kernel = new StandardKernel();
kernel.Bind<IRequestContent>().To<RequestContent>();
kernel.Bind<IRequest<IRequestContent>>().To<Request<IRequestContent>>();
var request = JsonConvert.DeserializeObject<IRequest<IRequestContent>>(str, new JsonSerializerSettings { ContractResolver = new NinjectContractResolver(kernel) });
Замечание

Свойства интерфейсов (самих интерфейсов, а не только классов, их реализующих) должны иметь сеттеры, иначе их значения не будут установлены.

Ninject + MOQ: заглушки для интерфейсов

var kernel = new StandardKernel();
kernel.Bind<ILogger>().ToMethod(ctx => new Mock<ILogger>().Object);

Исходный код

About the author

Добавить комментарий