我正在使用Ninject.Web.Common,到目前为止我真的很喜欢Ninject。我不习惯依赖注射,所以我有一个非常蹩脚的问题,但我不能google并回答到目前为止。 假设我有一个消息处理程序,它取决于我的IUnitOfWork实现。我需要构造我的处理程序的实例以将其添加到Web API配置。我已设法使用以下代码实现此目的:
var resolver = GlobalConfiguration.Configuration.DependencyResolver;
config.MessageHandlers.Add((myproject.Filters.ApiAuthHandler)resolver.GetService(typeof(myproject.Filters.ApiAuthHandler)));
我真的不喜欢打字这种东西,所以我想知道我做得对不对。手动构建依赖对象的常用方法是什么?
答案 0 :(得分:0)
嗯,我在半年前的实际项目中使用依赖注入,所以我对这些东西很新。我真的会推荐Dependency Injection in .NET书,其中描述的所有概念都很好,我从中学到了很多。
到目前为止,对我来说最有效的方法是覆盖默认控制器工厂:
public class NinjectControllerFactory : DefaultControllerFactory
{
private IKernel _kernel;
public NinjectControllerFactory()
{
_kernel= new StandardKernel();
ConfigureBindings();
}
protected override IController GetControllerInstance(RequestContext requestContext,
Type controllerType)
{
return controllerType == null
? null
: (IController)_kernel.Get(controllerType);
}
private void ConfigureBindings()
{
_kernel.Bind<IUnitOfWork>().To<MessageHandler>();
}
}
在Application_Start函数的Global.asax中,您只需添加以下行:
ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());
这种方法称为组合根模式,被认为是依赖注入的“好”方式。
我还建议您,如果您有多个端点,如服务和其他工作者,您应该创建一个Application.CompositionRoot项目,并为您的应用程序处理不同端点的不同绑定配置。