В прошлой статье «Создаем первое приложение на NancyFX» мы сделали первые шаги в изучении фреймворка NancyFX. В данной статье мы познакомимся со встроенными в Nancy по умолчанию TinyIoC и Nancy Bootstrapper.
Прямо из коробки с Nancy поставляется свой DI. Как уже говорилось ранее это TinyIoC. Если по каким то причинам данный DI не устраивает вас то вы можете установить один из следующих DI:
- Ninject
- Autofac
- StructureMap
- Windsor
- Mef
- Nancy bootstrapper for speedy mailer
- Nancy Mono bootstrapper for speedy mailer
Для того чтобы загрузить один из вышеперечисленных DIев вам всего лишь на всего требуется вызвать менеджер пакетов Nuget и набрать в строке поиска nancy.bootstrappers.
Однако вернемся к использованию пакета из коробки. В прошлой статье мы создали тестовый проект. Давайте воспользуемся им и добавим в него интерфейс IUserStorage.cs, который будет реализовываться нашим фейковым хранилищем.
using System.Collections.Generic;
namespace NancyFxApplication
{
public interface IUserStorage
{
IList<dynamic> GetAllUsers();
}
}
Далее собственно создаем наше фейковое хранилище Storage.cs которое будет реализовывать созданный нами интерфейс.
using System.Collections.Generic;
namespace NancyFxApplication
{
public class Storage : IUserStorage
{
public IList<dynamic> GetAllUsers()
{
return new List<dynamic>
{
new {Name = "Homer", Age = 30},
new {Name = "Bart", Age = 12},
new {Name = "Marge", Age = 30},
new {Name = "Lisa", Age = 10}
};
}
}
}
Добавим модуль Nancy с следующим кодом.
using Nancy;
namespace NancyFxApplication
{
public class UsersModule : NancyModule
{
public UsersModule(IUserStorage storage) : base("/users")
{
Get["/GetAll"] = param => (Response.AsJson(storage.GetAllUsers()));
}
}
}
После билда, запускаем наше приложение и получаем следующий результат:
Как мы можем заметить Nancy.Bootstrapper автоматически нашел и подставил в наш модуль первую найденную в приложение реализацию интерфейса IUserStorage без всяких усилий с нашей стороны. Однако некоторые заметят, что если в приложении будет еще одна реализация интерфейса IUserStorage то это поставит нас в некоторую неловкую ситуацию в которой мы не будем знать какую именно реализацию интерфейса вызовет Nancy(на самом деле Nancy вызовет первый по алфавиту класс из приложения реализующий запрашиваемый интерфейс, но от этого нам не становится легче). Если у нас в приложении существуют две и более реализации интерфейса нашего хранилища то нам на помощь прийдет TinyIoC.
Давайте добавим в наш проект следующий класс. SouthParkUsers.cs
using System.Collections.Generic;
namespace NancyFxApplication
{
public class SouthParkUsers : IUserStorage
{
public IList<dynamic> GetAllUsers()
{
return new List<dynamic>
{
new {Name = "Eric", SecondName = "Cartman", Age = 9},
new {Name = "Kenny", SecondName = "McCormick", Age = 9},
new {Name = "Kyle", SecondName = "Broflovski", Age = 9},
new {Name = "Stan", SecondName = "Marsh", Age = 9},
new {Name = "Butters", SecondName = "Stotch", Age = 9}
};
}
}
}
Теперь добавим класс MyBootstrapper.cs.
using Nancy;
namespace NancyFxApplication
{
public class MyBootstrapper : DefaultNancyBootstrapper
{
protected override void ApplicationStartup(Nancy.TinyIoc.TinyIoCContainer container, Nancy.Bootstrapper.IPipelines pipelines)
{
base.ApplicationStartup(container, pipelines);
container.Register<IUserStorage, SouthParkUsers>();
}
}
}
И теперь запустим приложение. Результат будет следующим:
Как видите мы подменили класс реализующий IUserStorage не прибегая к загрузке сторонних пакетов, а оперируя в рамках NancyFX. Как вы смогли убедиться, при использовании NancyFX достаточно легко использовать внедрение зависимости. Более детальную информацию и более расширенные примеры вы сможете найти на TinyIoC wiki, а также на Nancy Bootstrapper wiki.
В заключении хотелось бы сделать анонс следующей статьи по Nancy. В ней речь пойдет о Model Binding и десериализации объектов в Nancy. Спасибо за внимание. Буду рад отзывам на статью и комментариям.
Автор: Moozund