Используете Ninject в приложении .NET RESTful? - PullRequest
1 голос
/ 05 декабря 2011

Я новичок в сервисах 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. Может ли это быть проблемой версии?

Ответы [ 3 ]

2 голосов
/ 14 декабря 2011

Вы всегда должны вызывать базовый метод при переопределении виртуального метода. Смотри Application_Start().

2 голосов
/ 06 декабря 2011

Это может быть опечатка, но вы хотите связать интерфейсы с самим собой в вашем модуле? Обычно вы привязываете интерфейс к конкретному типу. Если Ninject попытается создать экземпляр типа интерфейса, он определенно потерпит неудачу, и в зависимости от конкретного поведения обработки ошибок в вашей настройке Ninject он либо выбросит, либо вернет null. Итак, убедитесь, что модуль настроен на поиск реального класса:

public class RestServiceModel : NinjectModule
    {
        public override void Load()
        {
            Bind<ITXESIIDService>().To<TXESIIDService>();
            ...
        }
    }
0 голосов
/ 06 декабря 2011

По поводу вашего обновления: я новичок в ninject, поэтому я ничего не знаю о старых версиях, но я полагаю, вы сначала попробуете Пример Ninject Extensions .Если они бегут, вы знаете, что это должно быть что-то еще.

...