我一直在尝试使用最新版本的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实现了更干净的解决方案?
谢谢任何意见!