7

使用 NuPack 插件并安装 NInject MVC 3 包会在生成的NinjectMVC3.cs文件中导致以下编译错误。

The name 'MvcServiceLocator' does not exist in the current context

David Ebbo 发布的示例视频显示它在 09:43 工作得很好

这是当前生成的类:

public class NinjectMVC3 {
    public static void RegisterServices(IKernel kernel) {
        //kernel.Bind<IThingRepository>().To<SqlThingRepository>();
    }

    public static void SetupDependencyInjection() {
        // Create Ninject DI Kernel 
        IKernel kernel = new StandardKernel();

        // Register services with our Ninject DI Container
        RegisterServices(kernel);

        // Tell ASP.NET MVC 3 to use our Ninject DI Container 
        MvcServiceLocator.SetCurrent(new NinjectServiceLocator(kernel));
    }
}
4

3 回答 3

13

基本上,MvcServiceLocator已经走了。我猜,每当制作视频时,都会出现版本不匹配的问题。

这里这里都有很好的解释。

使 Ninject 工作的两个步骤如下。替换NinjectMVC3为以下内容(我还更改了不必要的名称):

public class NinjectResolver : IDependencyResolver
{
    private static IKernel kernel;

    public NinjectResolver()
    {
        kernel = new StandardKernel();
        RegisterServices(kernel);
    }

    public static void RegisterServices(IKernel kernel)
    {
        //kernel.Bind<IThingRepository>().To<SqlThingRepository>();
    }

    public object GetService(Type serviceType)
    {
        return kernel.TryGet(serviceType);
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        return kernel.GetAll(serviceType);
    }
}

并将以下行添加到App_Start()ingloabl.asax.cs

DependencyResolver.SetResolver(new NinjectResolver());
于 2010-10-06T17:55:01.210 回答
5

我已经修复了包裹并将其上传到提要。如果您有机会尝试并验证它现在是否有效,那就太好了。我将 Ninject.MVC3 的版本从 0.1 提高到 0.2 :)

于 2010-10-06T18:20:37.280 回答
1

我刚刚安装了 Ninject.MVC3 0.3。我正在使用 ASP.NET MVC 3 Beta。

我已将此代码添加到我的Global.asax.cs文件中:

    public static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<IProductRepository>().To<SqlProductRepository>();
    }

    public void SetupDependencyInjection()
    {
        IKernel kernel = new StandardKernel();
        RegisterServices(kernel);
        DependencyResolver.SetResolver(new Ninject.Mvc3.NinjectServiceLocator(kernel));
    }

我已经添加了一个调用SetupDependencyInjection()Application_Start()函数,所以它看起来像这样:

    protected void Application_Start()
    {
        SetupDependencyInjection();

        AreaRegistration.RegisterAllAreas();

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);
    }

IProductRepositoryand是我在 Models 文件夹中创建的SqlProductRepository类,并且我已将构造函数依赖项添加到我的HomeController. 这是代码:

    private IProductRepository products;

    public HomeController(IProductRepository productRepository)
    {
        products = productRepository;
    }

我添加了一些断点并运行了应用程序,它就像一个魅力。希望这可以帮助。

于 2010-10-10T15:58:47.203 回答