Ninject 3.0 MVC kernel.bind error Авторегистрация
Получение и ошибка в kernel.Bind (scanner =>... "scanner" содержит маленькую строку ошибки в VS 2010.
Невозможно преобразовать лямбда-выражение в тип "System.Type[]", поскольку оно не является делегатом
Привязка к автоматической регистрации, как в старом kernel.scan в 2.0. Я не могу понять, что я делаю неправильно. Добавлено и удалено так много пакетов Ninject. полностью потерян, становясь большой тратой времени.
using System;
using System.Web;
using Microsoft.Web.Infrastructure.DynamicModuleHelper;
using Ninject;
using Ninject.Web.Common;
//using Ninject.Extensions.Conventions;
using Ninject.Web.WebApi;
using Ninject.Web.Mvc;
using CommonServiceLocator.NinjectAdapter;
using System.Reflection;
using System.IO;
using LR.Repository;
using LR.Repository.Interfaces;
using LR.Service.Interfaces;
using System.Web.Http;
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)
{
kernel.Bind(scanner => scanner.FromAssembliesInPath(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location))
.Select(IsServiceType)
.BindToDefaultInterface()
.Configure(binding => binding.InSingletonScope())
);
}
private static bool IsServiceType(Type type)
{
// temp return true;
// .Any() is not recognized either.
return true; // type.IsClass && type.GetInterfaces().Any(intface => intface.Name == "I" + type.Name);
}
2 ответа
Решение
Вы должны раскомментировать
//using Ninject.Extensions.Conventions;
Просто хотел сжать некоторые сборки, которые мне нужны, чтобы избавиться от моих ошибок. Спасибо Ремос
using System.Linq; //correct the .Any() error in the IsServiceType
using Ninject;
using Ninject.Web.Common;
using Ninject.Extensions.Conventions; //Corrected the error with kernel.bind
изменено.BindToDefaultInterface() -> .BindDefaultInterface()
Вот мой полный код, который работает. Надеюсь, кто-то поможет LSE.
[assembly: WebActivator.PreApplicationStartMethod(typeof(LongRanch.App_Start.NinjectWebCommon), "Start")]
[assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(LongRanch.App_Start.NinjectWebCommon), "Stop")]
namespace LongRanch.App_Start
{
using System;
using System.Web;
using System.Linq;
using Microsoft.Web.Infrastructure.DynamicModuleHelper;
using Ninject;
using Ninject.Web.Common;
using Ninject.Extensions.Conventions;
using System.Reflection;
using System.IO;
using LR.Repository;
using LR.Repository.Interfaces;
using LR.Service.Interfaces;
using System.Web.Http;
using LR.Service;
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);
GlobalConfiguration.Configuration
.ServiceResolver
.SetResolver(t => kernel.TryGet(t),
t => kernel.GetAll(t));
return kernel;
}
/// <summary>
/// Load your modules or register your services here!
/// </summary>
/// <param name="kernel">The kernel.</param>
private static void RegisterServices(IKernel kernel)
{
//kernel.Bind(scanner => scanner.FromAssembliesInPath(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location))
kernel.Bind(scanner => scanner.From("LR.Repository", "LR.Service")
.Select(IsServiceType)
.BindDefaultInterface()
.Configure(binding => binding.InSingletonScope())
);
}
private static bool IsServiceType(Type type)
{
return type.IsClass && type.GetInterfaces().Any(intface => intface.Name == "I" + type.Name);
}
}
}