C# 在.NETRESTful应用程序中使用Ninject?

C# 在.NETRESTful应用程序中使用Ninject?,c#,ninject,ioc-container,ninject-extensions,C#,Ninject,Ioc Container,Ninject Extensions,我是RESTful服务的新手,已经有一段时间没有使用IoC重新连接堆栈了,所以这对我来说是一个小小的打击 我的WCF服务如下所示(简化): 还添加了我的模块: public class RestServiceModel : NinjectModule { public override void Load() { Bind<ITXESIIDService>().To<TXESIIDService>();

我是RESTful服务的新手,已经有一段时间没有使用IoC重新连接堆栈了,所以这对我来说是一个小小的打击

我的WCF服务如下所示(简化):

还添加了我的模块:

 public class RestServiceModel : NinjectModule
    {
        public override void Load()
        {
            Bind<ITXESIIDService>().To<TXESIIDService>();
            Bind<IDoNotSolicitService>().To<DoNotSolicitService>();
        }
    }
公共类RestServiceModel:ninject模块
{
公共覆盖无效负载()
{
绑定()到();
绑定()到();
}
}
我自己的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);
    }
}
公共类NinjectServiceHostFactory:WebServiceHostFactory
{
受保护的重写ServiceHost CreateServiceHost(类型serviceType,Uri[]baseAddresses)
{
var serviceType参数=新构造函数参数(“serviceType”,serviceType);
var baseAddressesParameter=新的构造函数参数(“baseAddresses”,baseAddresses);
返回KernelContainer.Kernel.Get(serviceTypeParameter,baseAddressParameter);
}
}
当我以中的方式运行时,我得到一个错误,该行:

return KernelContainer.Kernel.Get<NinjectServiceHost>(serviceTypeParameter, baseAddressesParameter);
返回KernelContainer.Kernel.Get(serviceTypeParameter,baseAddressParameter);
不能为空

很明显我遗漏了什么,但我不知道是什么。在这一点上,我尝试了各种各样的方法,我看到的大多数例子都是针对WCF服务的,我设法找到的RESTful服务对于那些熟悉的w/Ninject或IoC常客来说有点太适合了

另外,在我的业务层和数据层(使用实体框架)中,我也希望在那里实现Ninject,是将各层单独连接起来的最佳实践,还是可以在一个位置完成所有工作

谢谢

更新1
我已经纠正了装订问题,但这仍然使我感到震惊。我使用的是Ninject.Extensions.Wcf,它正在查找Ninject.wcfaapplication.cs文件,该文件似乎根本不正确。我使用NuGet为Ninject包含一个包,这可能是版本问题吗?

这可能是一个输入错误,但您的意思是在模块中将接口绑定到自己吗?通常将接口绑定到具体类型。如果Ninject尝试实例化接口类型,它肯定会失败,并且根据Ninject设置的特定错误处理行为,它将抛出或返回null。因此,请确保将模块配置为查找真实类:

public class RestServiceModel : NinjectModule
    {
        public override void Load()
        {
            Bind<ITXESIIDService>().To<TXESIIDService>();
            ...
        }
    }
公共类RestServiceModel:ninject模块
{
公共覆盖无效负载()
{
绑定()到();
...
}
}

这可能是一个输入错误,但您的意思是将接口绑定到模块中的接口本身吗?通常将接口绑定到具体类型。如果Ninject尝试实例化接口类型,它肯定会失败,并且根据Ninject设置的特定错误处理行为,它将抛出或返回null。因此,请确保将模块配置为查找真实类:

public class RestServiceModel : NinjectModule
    {
        public override void Load()
        {
            Bind<ITXESIIDService>().To<TXESIIDService>();
            ...
        }
    }
公共类RestServiceModel:ninject模块
{
公共覆盖无效负载()
{
绑定()到();
...
}
}

关于您的更新:我是ninject的新手,所以我对旧版本一无所知,但我想您应该先试用一下。如果它们运行,您知道它一定是其他东西。

关于您的更新:我是ninject的新手,所以我对旧版本一无所知,但我想您应该先试用一下。如果它们运行,您知道它一定是其他的。

在重写虚拟方法时,始终必须调用基方法。请参见
Application\u Start()

重写虚拟方法时,始终必须调用基本方法。请参阅
Application\u Start()

您完全正确,这一点已得到纠正。我现在遇到的问题是,我正在使用Ninject.Extensions.Wcf,显然它或我丢失了文件。伟大的无论如何,谢谢你在装订问题上的提醒,我会相应地编辑我的文章。你完全正确,这是正确的。我现在遇到的问题是,我正在使用Ninject.Extensions.Wcf,显然它或我丢失了文件。伟大的无论如何,感谢大家对绑定问题的关注,我会相应地编辑我的文章。但我不建议在RESTAPI中使用WCF REST。那个项目已经死了,但我不建议您在RESTAPI中使用WCF REST。那个项目已经失败了。
public class RestServiceModel : NinjectModule
    {
        public override void Load()
        {
            Bind<ITXESIIDService>().To<TXESIIDService>();
            ...
        }
    }