【发布时间】:2011-08-19 20:28:37
【问题描述】:
所以我一直在玩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 的输出。
所以,对于这个问题。有没有一种 cleaner 的方式来编写这个工厂?我真的糊涂了,感觉不对。我觉得我错过了一些明显盯着我的脸。我在新的 Resolve 方法中进行的 hack 感觉特别脏,所以我想我会利用那些更有经验的人来加强这一点。有其他人使用 WCF Web API 实现了 Ninject 并实现了更简洁的解决方案吗?
感谢您的任何意见!
【问题讨论】:
-
这看起来和我用结构图做的事情比较相似。传递对象总是感觉有点 hacky,但如果它是框架给你的,除了滚动你自己的之外,还有什么选择。
标签: c# .net ninject ioc-container wcf-web-api