Ответ 1
Вы извлекаете из NinjectHttpApplication
И вы используете App_Start
одновременно. Выбери один! Подробнее читайте в документе Ninject.MVC3.
Я создал новое веб-приложение MVC, и у меня есть ссылки на Ninject.dll, Ninject.Web.Common.dll и Ninject.Web.MVC.dll.
Global.asax.cs:
public class MvcApplication : NinjectHttpApplication
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new
{
controller = "Home",
action = "Index",
id = UrlParameter.Optional
});
}
protected override IKernel CreateKernel()
{
var kernel = new StandardKernel();
kernel.Load(Assembly.GetExecutingAssembly());
return kernel;
}
protected override void OnApplicationStarted()
{
base.OnApplicationStarted();
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
}
App_start\NinjectWebCommon:
public static class NinjectWebCommon
{
private static readonly Bootstrapper bootstrapper = new Bootstrapper();
/// <summary>
/// Starts the application
/// </summary>
public static void Start()
{
DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
bootstrapper.Initialize(CreateKernel);
}
/// <summary>
/// Stops the application.
/// </summary>
public static void Stop()
{
bootstrapper.ShutDown();
}
/// <summary>
/// Creates the kernel that will manage your application.
/// </summary>
/// <returns>The created kernel.</returns>
private static IKernel CreateKernel()
{
var kernel = new StandardKernel();
kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();
RegisterServices(kernel);
return kernel;
}
/// <summary>
/// Load your modules or register your services here!
/// </summary>
/// <param name="kernel">The kernel.</param>
private static void RegisterServices(IKernel kernel)
{
}
}
Я получаю сообщение об ошибке "Последовательность не содержит элементов". Что я делаю неправильно?
Сведения об ошибке:
Description: An unhandled exception occurred during the execution of the current web request. Examine the stack trace for more information about this error and where it originated in the code.
Exception Details: System.InvalidOperationException: Sequence contains no elements
Source Error:
Unhandled exception occurred during execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.
Stack Trace:
[InvalidOperationException: Последовательность не содержит элементов]
System.Linq.Enumerable.Single(IEnumerable`1 source) +320
Ninject.Web.Mvc.NinjectMvcHttpApplicationPlugin.Start() in c:\Projects\Ninject\ninject.web.mvc\mvc3\src\Ninject.Web.Mvc\NinjectMvcHttpApplicationPlugin.cs:53
Ninject.Web.Common.Bootstrapper.<Initialize>b__0(INinjectHttpApplicationPlugin c) in c:\Projects\Ninject\Ninject.Web.Common\src\Ninject.Web.Common\Bootstrapper.cs:52
Ninject.Infrastructure.Language.ExtensionsForIEnumerableOfT.Map(IEnumerable`1 series, Action`1 action) in c:\Projects\Ninject\ninject\src\Ninject\Infrastructure\Language\ExtensionsForIEnumerableOfT.cs:32
Ninject.Web.Common.Bootstrapper.Initialize(Func`1 createKernelCallback) in c:\Projects\Ninject\Ninject.Web.Common\src\Ninject.Web.Common\Bootstrapper.cs:52
Ninject.Web.Common.NinjectHttpApplication.Application_Start() in c:\Projects\Ninject\Ninject.Web.Common\src\Ninject.Web.Common\NinjectHttpApplication.cs:80
Вы извлекаете из NinjectHttpApplication
И вы используете App_Start
одновременно. Выбери один! Подробнее читайте в документе Ninject.MVC3.
Чтобы быть явным образом об этом, если вы используете NuGet для добавления пакета "Ninject.Mvc3" (я использовал версию 3.0.0.6), нет необходимости вносить какие-либо изменения в global.asax.cs
. Пакет NuGet делает магию для вас, создав класс NinjectWebCommon
в папке App_Start
вашего проекта MVC 4.
Я говорю это, потому что я, похоже, следовал аналогичному руководству к оригинальному плакату (я последовал за статьей "Проект кода" под названием " Injection Dependency in asp.NET mvc4 и webapi с использованием Ninject '), и имел ту же проблему, что и исходный плакат. В статье "Проект кода" не указано, что вы должны или использовать NuGet (и не трогать global.asax.cs
или вручную добавлять ссылки Ninject (и изменить global.asax.cs
).
Убедитесь, что вы не ссылаетесь на проект, который также использует NinjectMVC3 App_Start
.
После удаления ссылки на такой, мой проект начал работать. Кроме того, как говорилось ранее, проверьте, все пространства имен совпали и верны.