Я новичок в сервисах RESTful, и мне давно не приходилось заново подключать стек, используя IoC, так что это дает мне легкий удар.
У меня есть служба WCF, которая выглядит так (упрощенно):
public interface IESIID
{
[OperationContract]
[WebGet(UriTemplate = "/{guid}/{id}", ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Wrapped)]
Message LookupESIID(string guid, string id);
}
public class ESIID : BaseREST<ESI>, IESIID
{
private readonly ITXESIIDService _bllSvc;
public ESIID(ITXESIIDService svc)
{
_bllSvc = svc;
}
public Message LookupESIID(string guid, string id)
{
return GetById(guid, id);
}
private Message GetById(string guid, string id)
{
apiAuthentication = new APIKeyAuthentication();
if (!apiAuthentication.IsValidAPIKey(guid))
return APIError();
//_bllSvc = new TXESIIDService(); <--- WANTING TO AVOID THIS!!!!
var results = _bllSvc.SelectByID(id);
return results.Count == 0 ? NoResults() : CreateMessage(results);
}
}
Хорошо, это довольно просто. Я добавил параметр конструктора, потому что при вызове метода BLL TXESIIDService.
Итак, я изменил свой глобальный файл для Ninject, который теперь выглядит примерно так:
public class Global : NinjectWcfApplication
{
protected override void Application_Start(object sender, EventArgs e)
{
RegisterRoutes();
}
protected override IKernel CreateKernel()
{
return new StandardKernel(new RestServiceModel());
}
private static void RegisterRoutes()
{
RouteTable.Routes.Add(new ServiceRoute("ESIID", new NinjectServiceHostFactory(), typeof(ESIID)));
}
}
а также добавил мой модуль:
public class RestServiceModel : NinjectModule
{
public override void Load()
{
Bind<ITXESIIDService>().To<TXESIIDService>();
Bind<IDoNotSolicitService>().To<DoNotSolicitService>();
}
}
А для устранения неполадок я добавил собственный NinjectServiceHostFactory
public class NinjectServiceHostFactory : WebServiceHostFactory
{
protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
var serviceTypeParameter = new ConstructorArgument("serviceType", serviceType);
var baseAddressesParameter = new ConstructorArgument("baseAddresses", baseAddresses);
return KernelContainer.Kernel.Get<NinjectServiceHost>(serviceTypeParameter, baseAddressesParameter);
}
}
Когда я запускаю это как в, я получаю ошибку, что строка:
return KernelContainer.Kernel.Get<NinjectServiceHost>(serviceTypeParameter, baseAddressesParameter);
не может быть нулевым.
Очевидно, я что-то здесь упускаю, но не могу понять, что. В этот момент я пробовал разные вещи, и большинство примеров, которые я вижу, относится к сервисам WCF, а те RESTful, которые мне удалось найти, слишком приспособлены для знакомых постоянных клиентов с Ninject или IoC.
Кроме того, в моих слоях Business и Data (с использованием структуры сущностей) я также собираюсь реализовать там Ninject, рекомендуется ли размещать слои по отдельности или можно сделать все это в одном месте
Спасибо.
ОБНОВЛЕНИЕ 1
Я исправил проблему с привязкой, но это все еще бомбы на меня. Я использую Ninject.Extensions.Wcf и пытаюсь найти файл NinjectWcfApplication.cs, который не выглядит правильным. Я использовал NuGet для включения пакета для Ninject. Может ли это быть проблемой версии?