2

我使用 nuget 模板方式对我的 MVC3 应用程序进行 ninject,这意味着我已经使用 WebActivator 调用静态类上的方法,该方法反过来创建 Ninject 引导程序并连接到 MVC3。

这适用于控制器、适配器等。但我想要另一个 Webactivator 激活类,它使用 Ninject 获取其依赖项。

我让它与一个糟糕的解决方案一起工作,但我更喜欢一个更优雅的解决方案。

首先,我确保我的 Webactivator 类使用 PostApplicationStartMethod 调用,因为 Ninject 模块使用 PreApplicationStartMethod 我可以确保 ninject 已加载并准备就绪。然后在 Start 方法中我做

var workers = DependencyResolver.Current.GetServices<IWorker>();

为了获得我的依赖,整个类看起来像这样

[assembly: WebActivator.PostApplicationStartMethod(typeof(SHB.DALA.Web.App_Start.WorkflowRunner), "Start")]

namespace SHB.DALA.Web.App_Start
{
    public static class WorkflowRunner 
    {
        public static void Start()
        {
            var workers = DependencyResolver.Current.GetServices<IWorker>();
            //Do stuff with worker collection
        }
    }
}

一定有更优雅的解决方案吧?

4

2 回答 2

3

WebActivator(实际上是 ASP.NET)对 Ninject 项目一无所知,因此无法注入任何参数。你需要一个 Ninject WebActivator 扩展(就像你拥有一个 Ninject MVC 扩展一样)来实现它。但坦率地说,这有点像第 22 条规则:您希望 WebActivator 设置 Ninject,同时让 Ninject 设置 WebActivator。

我可以为您想到两种可能的情况:

  1. 让代码保持原样 - 老实说,我不知道你为什么不喜欢你的WorkflowRunner课程。这是一个不错的小类,没有其他代码对它有任何依赖,您可以通过将DependencyResolver您从 Ninject 本身抽象出来的引用来获取引用,您的工作流程初始化很好地封装在那里。我在这里没有闻到任何不对劲,真的。

  2. 在设置 Ninject 的其他 WebActivator 类中初始化您的工作流。您知道您的 Ninject 已初始化,您仍然可以将工作流初始化代码保存在单独的类中。

如果我是你,我显然会选择 1。

于 2011-10-27T06:30:19.123 回答
0

如果您已经让 Ninject 引导程序正常工作,您确定需要其他解决方案吗?对于非控制器依赖项,我使用具有 GetInstance() 方法的 BindingFactory 类。这只是调用内核对象上的 Get() 方法。

public class BindingFactory
{
    private static readonly IKernel Kernel = new StandardKernel(new DefaultServices());

    public static T GetInstance<T>()
    {
        return Kernel.Get<T>();
    }

    public static IController GetControllerInstance(Type controllerType)
    {
        return Kernel.Get(controllerType) as IController;
    }
}

然后我使用一个利用 BindingFactory 的 NinjectControllerFactory。

public class NinjectControllerFactory : DefaultControllerFactory
{
    protected override IController GetControllerInstance(RequestContext context, Type controllerType)
    {
        if (controllerType == null)
            return null;

        return BindingFactory.GetControllerInstance(controllerType);
    }
}

所以我认为你可以调整你当前的实现。

于 2011-10-26T13:13:17.350 回答