2011-05-27 43 views
5

我目前正在測試溫莎城堡與Ninject,我真的很喜歡溫莎提供的,我只是有一個存儲庫注入的問題。城堡windsor控制器工廠和存儲庫不解決

所以,這裏的設置...我有一個ControllersInstaller看起來像這樣...

public class ControllersInstaller : IWindsorInstaller 
{ 
    public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
     container.Register(FindControllers().Configure(ConfigureControllers())); 
    } 

    private BasedOnDescriptor FindControllers() 
    { 
     return AllTypes.FromThisAssembly() 
      .BasedOn<IController>() 
      .If(Component.IsInSameNamespaceAs<HomeController>()) 
      .If(t => t.Name.EndsWith("Controller")); 

    } 

    private ConfigureDelegate ConfigureControllers() 
    { 
     return c => c.LifeStyle.Transient; 
    } 
} 

上下文安裝程序看起來像這樣...

public class ContextInstaller : IWindsorInstaller 
{ 
    public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
     container.Register(AllTypes.FromThisAssembly() 
      .Where(t => t.Name == "MyContext")); 
    } 
} 

和回購安裝程序看起來像......

public class RepoInstaller : IWindsorInstaller 
{ 

    public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
     container.Register(AllTypes.FromThisAssembly() 
      .Where(type => type.Name.EndsWith("Repo")) 
      .WithService.DefaultInterface() 
      .Configure(c => c.LifeStyle.Singleton)); 
    } 
} 

然後在Global.asax中,我通過註冊他們...

private static void BootstrapContainer() 
    { 
     var container = new WindsorContainer() // Create a container to hold the dependencies 
      .Install(
      new ContextInstaller(), 
      new RepoInstaller(), 
      new ControllersInstaller() 
      );  // Scan this assembly for all IWindsorInstaller 

     var controllerFactory = new WindsorControllerFactory(container.Kernel);  // Create a new instance 
     ControllerBuilder.Current.SetControllerFactory(controllerFactory);   // Use my factory instead of default 
    } 

我家的控制器看起來像......

public class HomeController : Controller 
{ 
    IMyRepo _repo; 

    public HomeController(MyRepo repo) 
    { 
     _repo = repo; 
    } 

但無論出於何種原因,當我調試,我得到的東西...... 該組件的一些依賴性不能靜態地解決。 MyProject.Controllers.HomeController正在等待下列依賴項:服務: - 未註冊的MyProject.Models.MyRepo。

而我不明白爲什麼!我嘗試將我的repo安裝程序安裝爲單例,並嘗試重新註冊註冊過程,以便在控制器之前設置repo。

當我在Global.asax中調試並命中控制器工廠時,它表示除HomeController外的所有內容都已正確解析。

想法?

回答

3

如果您註冊您的存儲庫,包括接口 .WithService.DefaultInterface() 您的依賴性必須基於接口(可能是IRepo)而不是具體的。

如果你的依賴是基於具體的,不是刪除.WithService.DefaultInterface()等的依賴將得到解決......但是這nont最好的辦法:爲庫總是基於接口

1

我總是依賴恨回答我自己的問題,但有時它必須完成...

這是一個小而愚蠢的事情,我錯過了!原來,問題出在我的控制器上。我試圖將實際的回購傳入我的HomeController()構造函數。

我把它切換到

public ActionResult HomeController(IRepo repo) 
{ 
    _repo = repo; 
} 

而這也正是它需要工作...嘖...

+1

其實我說你:-P我很高興你發現它相同的解決方案你自己。與溫莎玩得開心! – Crixo 2011-05-31 13:00:48

+0

不客氣! – Crixo 2011-05-31 14:20:05