0

我正在使用 Ninject.Web.Common,到目前为止我真的很喜欢 Ninject。我还不习惯依赖注入,所以我有一个非常蹩脚的问题,但到目前为止我无法谷歌并回答。假设我有一个消息处理程序,它取决于我的 IUnitOfWork 实现。我需要构造我的处理程序的一个实例以将其添加到 Web API 配置中。我已经设法使用以下代码实现了这一点:

var resolver = GlobalConfiguration.Configuration.DependencyResolver;
            config.MessageHandlers.Add((myproject.Filters.ApiAuthHandler)resolver.GetService(typeof(myproject.Filters.ApiAuthHandler)));

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

4

1 回答 1

0

好吧,我仅在半年前就在现实世界的项目中使用了依赖注入,所以我对这些东西还很陌生。我真的会推荐.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 项目并在那里为您的应用程序的不同端点处理不同的绑定配置。

于 2013-01-25T19:36:09.447 回答