使用新的WCF Web API设置Ninject

7

我一直在尝试使用最新版本的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方法中做的hack尤其肮脏,所以我想利用那些经验更丰富的人来改进它。是否有其他人使用Ninject和WCF Web API实现了更干净的解决方案?
谢谢任何意见!

这看起来与我使用StructureMap做过的某些事情相对类似。传递对象总是感觉有点hacky,但如果这是框架提供给你的东西,除了自己编写之外还有什么选择呢? - nathan gonzalez
1个回答

0

您可以通过从应用程序范围传递内核来实现它。

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
    }
}

是的,这样可以相当程度地清理工厂。我真正想要关注的部分是Resolve方法被限制为返回一个对象而不是一个类型化的结果,但我猜这个实现将不得不使用,直到/如果微软团队修改返回值。 - Khepri
IResourceFactory是从哪里来的?这是一个Web API接口吗?我正在尝试在Web API的预览5中使其工作,但没有成功。你使用了Ninject.MVC或WCF扩展还是两者都用了?谢谢。 - Cragly
@Cragly 这个答案是针对 Preview 3 的,不适用于 Preview 5。 - Jonathan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接