Настройка Ninject с новым веб-API WCF - PullRequest
7 голосов
/ 06 мая 2011

Итак, я поигрался с последним выпуском WCF Web API и решил, что хочу погрузиться в реализацию Ninject с ним.

На основании прочитанногоМне нужно реализовать интерфейс IResourceFactory, который требует следующих методов:

    public object GetInstance(System.Type serviceType, 
                              System.ServiceModel.InstanceContext instanceContext,
                              System.Net.Http.HttpRequestMessage request);

    public void ReleaseInstance(System.ServiceModel.InstanceContext instanceContext,
                                object service);

Поэтому я поцарапал следующее:

public class NinjectResourceFactory : IResourceFactory
{
    private readonly IKernel _kernel;

    public NinjectResourceFactory()
    {
        var modules = new INinjectModule[]
                          {
                              new ServiceDIModule(),    //Service Layer Module
                              new RepositoryDIModule(), //Repo Layer Module
                              new DataServiceDIModule()
                          };

        _kernel = new StandardKernel(modules);
    }

    #region IResourceFactory Members

    public object GetInstance(Type serviceType,
                              InstanceContext instanceContext,
                              HttpRequestMessage request)
    {
        return Resolve(serviceType);
    }

    public void ReleaseInstance(InstanceContext instanceContext, object service)
    {
        throw new NotImplementedException();
    }

    #endregion

    private object Resolve(Type type)
    {
        return _kernel.Get(type);
    }

    //private T Resolve<T>()
    //{
    //    return _kernel.Get<T>();
    //}

    //private T Resolve<T>(string name)
    //{
    //    return _kernel.Get<T>(metaData => metaData.Has(name));
    //    return _kernel.Get<T>().Equals(With.Parameters.
    //                                   ContextVariable("name", name));
    //}
}

и связал его с

var configuration = HttpHostConfiguration.Create().SetResourceFactory(new NinjectResourceFactory());
     RouteTable.Routes.MapServiceRoute<StateProvinceResource>("States", configuration);

Удивительно, но это похоже на работу.Первый метод ресурсов, который я создал для предоставления списка штатов / провинций, генерирует выходные данные с HTTP 200 OK.

Итак, к вопросу.Есть ли чище способ написания этой фабрики?Я действительно провалился через это, и это просто не чувствуется правильным.Я чувствую, что скучаю по чему-то очевидному, уставившемуся мне в лицо.Взлом, который я сделал в новом методе Resolve, кажется особенно грязным, поэтому я решил использовать более опытных, чтобы усилить это.Кто-нибудь еще реализовал Ninject с помощью веб-API WCF и внедрил более чистое решение?

Спасибо за любой вклад!

1 Ответ

0 голосов
/ 06 мая 2011

Вы можете реализовать это, передав ядро ​​из области приложения.

public class NinjectResourceFactory : IResourceFactory
{
    private readonly IKernel _kernel;

    public NinjectResourceFactory(IKernel kernel)
    {
        _kernel = kernel;
    }

    public object GetInstance(Type serviceType, InstanceContext instanceContext, HttpRequestMessage request)
    {
        return _kernel.Get(serviceType);
    }

    public void ReleaseInstance(InstanceContext instanceContext, object service)
    {
        // no op
    }
}
...