如何手动正确构造依赖对象?

时间:2013-01-25 15:57:56

标签: asp.net-mvc-4 ninject ninject.web.mvc

我正在使用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)));

我真的不喜欢打字这种东西,所以我想知道我做得对不对。手动构建依赖对象的常用方法是什么?

1 个答案:

答案 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项目,并为您的应用程序处理不同端点的不同绑定配置。