2010-04-09 3 views
2

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

Global.asax.cs

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

     RegisterRoutes(RouteTable.Routes); 


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

Controller Factory:

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>(); 
    } 

} 

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

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

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

+0

Глупый я, конструктор моей конкретной реализации требует строки подключения. Теперь я должен узнать, как сообщить об этом Ninject ... – hoetz

ответ

0

Хорошо, я сделал несколько рефакторингов, и теперь у меня это работает. Я отправлю код моего 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 автоматически загружать его оттуда, но мне все равно нужно будет передать строку подключения до конструктор конкретной реализации. Может быть, у кого-то появилась идея, но на данный момент это прекрасно работает.

Смежные вопросы