2

首先,我使用的是 Ninject 2.0

我有我想注入的母版页,但我不太确定如何注入。我尝试的是创建一个派生自 System.Web.Mvc.ViewMasterPage 的类,然后创建我的属性:

[Inject]
public ICacheService<List<Category>> Categories { get; set; }
[Inject]
public IConfigurationSettings Config { get; set; }

当我运行我的页面时,两个属性都没有设置并且都是空的。关于如何执行此操作的原因或示例的任何想法?谢谢

- 更新

所以我做了更多的研究,似乎我需要自己解决类中的对象,因为 Ninject 不会拦截类的创建。所以现在我的问题是如何为我的内核创建解析器?上面的代码在一个类库中,所以我没有对内核的引用。我尝试了以下方法:(稍微修改自http://www.codethinked.com/post/2009/10/07/Our-Biggest-Enemy-Isne28099t-Developers-Who-Refuse-To-Move-Forward-It-is -Developers-Who-Pretend-To-Move-Forward.aspx )

public class KernelResolver
{
    private static IKernel _kernel;

    public KernelResolver(IKernel kernel)
    {
        _kernel = kernel;
    }

    public static T Resolve<T>()
    {
        return _kernel.Get<T>();
    }
}

然后注册:

Bind<KernelResolver>().ToSelf()

然而内核是空的......我只需要查看一些示例,但我找不到任何示例,或者可能是我很困惑以至于我不知道我在寻找什么:\

任何帮助深表感谢!

4

2 回答 2

3

我首先要问:为什么要将任何内容注入母版页?如果您使用的是 MVC,您确实希望使用模型通过控制器将数据传递给您的视图(包括母版页)。这就是 MVC 框架的本质,如果可能过于简化的话。

Ninject 或其他 IoC 容器可以为您做的是帮助创建您的控制器类并将依赖项注入其中——实际上,ASP.Net 中 IoC 容器的集成点通常接管了控制器工厂的职责。

将适当的依赖项注入您的控制器可以帮助控制器确定适当的模型或模型的状态以传递给您的视图(包括母版页)。

我喜欢将 MVC 模式(以及就此而言,ASP.Net MVC)视为将所有决策制定(即控制)的责任放在控制器类中。控制器执行的决策可能会受到大量输入(例如配置、用户输入、环境等)的影响,但在某些时候,控制器会将模型传递给视图。我想到了包含系统主题状态的模型。在我看来,尤其是在 ASP.Net MVC 中的视图最好被视为没有任何逻辑,更像是“脚本”,而不是某些对象模型中的真实类或一流公民。

也许您有充分的理由让您的视图母版页“更智能”,但通常情况下,您希望注入的内容类型最好注入您的控制器,并将必要的数据传递给您的视图。我很想知道更多关于你想要完成的事情。

注意:您可以轻松设置 Ninject 与 MVC 的集成,以注入所有控制器的依赖项。查看这个 StackOverflow问题/答案线程以获取详细信息。

于 2009-12-01T16:30:07.963 回答
1

该类KernelResolver实现了一个服务定位器模式(向您的依赖项[中心]询问),这通常是最后的手段而不是主要方法。你真正想要的是让你的依赖注入工作。

你绝对Bind KernelResolver不会做任何事情——它充当了整个容器,并且系统(例如,MVC 的工厂)需要被连接起来以得到它的帮助。

这些[Inject]属性本身不会做任何魔术 - 当有人请求它注入该类型的对象时,Ninject 会使用它们。

您正在寻找的是如何告诉 MVC 在正确的时间调用 Ninject 的示例,我将让您搜索(ninject "asp.net mvc" 示例?)。

于 2009-12-01T09:12:33.933 回答