Ninject 2 + ASP.NET MVC 2 Типы привязки из внешних сборок - PullRequest
2 голосов
/ 10 апреля 2010

Я просто пытаюсь начать работу с Ninject 2 и ASP.NET MVC 2. Я следовал этому руководству http://www.craftyfella.com/2010/02/creating-aspnet-mvc-2-controller.html, чтобы создать фабрику контроллеров с Ninject и связать первый реферат с конкретной реализацией. Теперь я хочу загрузить тип репозитория из другой сборки (где находятся мои конкретные репозитории SQL), и я просто не могу заставить его работать. Вот мой код:

Global.asax.cs

 protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        RegisterRoutes(RouteTable.Routes);


        ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory());
    }

Контроллер Фабрика:

public class Kernelhelper
{
    public static IKernel GetTheKernel()
    {
        IKernel kernel = new StandardKernel();
        kernel.Load(System.Reflection.Assembly.Load("MyAssembly"));
        return kernel;
    }
}

public class MyControllerFactory : DefaultControllerFactory
{
    private IKernel kernel = Kernelhelper.GetTheKernel();


    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {

        return controllerType == null ? null : (IController)kernel.Get(controllerType);
    }
}

В «MyAssembly» есть Модуль:

    public class ExampleConfigModule : NinjectModule
{
    public override void Load()
    {
        Bind<Domain.CommunityUserRepository>().To<SQLCommunityUserRepository>();
    }

}

Теперь, когда я просто добавляю объект MockRepository в моей точке входа, он работает просто отлично, контроллер, которому нужен репозиторий, работает нормально. Kernel.Load (System.Reflection.Assembly.Load ("MyAssembly")); также выполняет свою работу и регистрирует модуль, но как только я вызываю контроллер, которому нужен репозиторий, я получаю исключение ActivationException от Ninject:

Нет доступных привязок, и тип не является самосвязываемым. Путь активации: 2) Инъекция зависимости CommunityUserRepository в параметр _rep конструктора типа AccountController 1) Запрос на AccountController

Может ли кто-нибудь дать мне лучший пример для привязки типов из внешних сборок (что действительно является важным аспектом внедрения зависимостей)? Спасибо!

1 Ответ

0 голосов
/ 10 апреля 2010

Хорошо, я провел некоторый рефакторинг, и теперь он запущен. Я выложу код моего Global.asax, так как там все и происходит. Я использую последнюю сборку Ninject 2 с последней сборкой Ninject.Web.Mvc для MVC 2.

 public class MvcApplication : NinjectHttpApplication
{
    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 = "" }  // Parameter defaults
        );

    }

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

        RegisterRoutes(RouteTable.Routes);

        RegisterAllControllersIn(System.Reflection.Assembly.GetExecutingAssembly());
    }


    protected override Ninject.IKernel CreateKernel()
    {

        var kernel = new StandardKernel();
        kernel.Load(new ExampleConfigModule());
        return kernel;
    }
}

public class ExampleConfigModule : Ninject.Modules.NinjectModule
{
    public override void Load()
    {
        string connectionString =
            ConfigurationManager.ConnectionStrings
            ["ConnectionString1"].ConnectionString;
        string communityUserRepTypeName =
           ConfigurationManager.AppSettings
           ["CommunityUserRepositoryType"];
        var communityUserRepositoryType =
            Type.GetType(communityUserRepTypeName, true);
        Bind<Domain.CommunityUserRepository>().To(communityUserRepositoryType).WithConstructorArgument("conString",connectionString);
    }

}

Как вы можете видеть, я избавился от своего ControllerFactory, унаследованного от NinjectHttpApplication, и загрузил и связал тип внешних сборок в модуле. Теперь может быть лучший способ без указания типа в виде строки в файле конфигурации, может быть, вы можете объявить модуль во внешней сборке и позволить Ninject автоматически загрузить его оттуда, но мне все равно нужно будет передать строку подключения в конструктор конкретной реализации. Может быть, у кого-то есть идея для этого, но сейчас это прекрасно работает.

...