MVC2 & Ninject2 - Контроллеры не разрешают зависимость - PullRequest
0 голосов
/ 25 марта 2011

Я по глупости решил попробовать что-то новое на пятничной работе!

Поэтому я использовал NuGet для добавления Ninject.Web.Mvc 2.2.x.x в мой проект .Net MVC2.

Я изменил свой Global.asax.cs

using System.Web.Mvc;
using System.Web.Routing;
using IntegraRecipients;
using Mailer;
using Ninject;
using Ninject.Web.Mvc;
using Ninject.Modules;

namespace WebMailer
{

public class MvcApplication : NinjectHttpApplication
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.IgnoreRoute("favicon.ico");

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Mail", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );

    }

    protected override void OnApplicationStarted()
    {
        AreaRegistration.RegisterAllAreas();

        RegisterRoutes(RouteTable.Routes);
    }

    protected override IKernel CreateKernel()
    {
        return new StandardKernel(new INinjectModule[] { new MailModule()});
    }

    internal class MailModule : NinjectModule
    {
        public override void Load()
        {
            Bind<IMailing>().To<Mailing>();
            Bind<IMailingContext>().To<MailingContext>();
            Bind<IRecipientContext>().To<RecipientContext>();
        }
    }
}

}

и я создал такой контроллер, как ...

using System.Linq;
using System.Web.Mvc;
using WebMailer.Models;

namespace WebMailer.Controllers
{
    [ValidateInput(false)]
    public class MailController : Controller
    {
        private readonly IMailingContext _mailContext;
        private readonly IRecipientContext _integraContext;

        public MailController(IMailingContext mail,IRecipientContext integra)
        {
            _mailContext = mail;
            _integraContext = integra;
        }

        public ActionResult Index()
        {
            return View(_mailContext.GetAllMailings().Select(mailing => new MailingViewModel(mailing)).ToList());
        }
    }
}

Но контроллер все еще настаивает на том, чтобы

Не удалось найти тип или имя пространства имен «IRecipientContext» (отсутствует директива using или ссылка на сборку?)

и

Не удалось найти тип или имя пространства имен IMailingContext (отсутствует директива using или ссылка на сборку?)

Мой гугл-фу подвел меня, и я очень надеюсь, что это просто глупая опечатка.

Заранее спасибо

P

Ответы [ 2 ]

1 голос
/ 25 марта 2011

Ninject не меняет способ компиляции сборок! Это не волшебным образом добавляет ссылки на другие сборки или добавляет директивы использования. Если вы используете интерфейсы из других сборок, вы должны добавить директиву using и ссылку на эту сборку.

Все, что Ninject собирается подключить к вашему приложению во время выполнения.

0 голосов
/ 06 апреля 2011

У меня есть то, что кажется похожей проблемой.

У меня есть простой проект окна WPF со скомпилированным Ninject.dll, связанным с. Однако, следующее дает мне ошибки ...

using Ninject;
namespace CatalogueManager
{
  public class ServiceLocator
  {
    public IMainWindowViewModel GetMainWindowViewModel()
    {
      return Kernel.Get<IMainWindowViewModel>();
    }

    static IKernel Kernel;
    static ServiceLocator()
    {
      Kernel = new StandardKernel(new NinjectConfiguration());
    }
  }
}

В частности, пространство имен "Ninject" и IKernel запрашивают сообщение времени компиляции "тип или пространство имен 'X' не найдено ..."

...