2009-05-22 55 views
1

我試圖從他的親Asp.Net MVC框架書(偉大的書,順便說一句)實現史蒂文桑德森的WinsorControllerFactory,我絆倒了一個問題。我不確定你需要知道什麼才能制定迴應,但我非常感謝這方面的任何幫助。謝謝!需要幫助Castle.Windsor作爲一個Asp.Net MVC ControllerFactory請

下面的代碼:

WindsorControllerFactory

public class WindsorControllerFactory : DefaultControllerFactory 
{ 
    private WindsorContainer _container; 

    public WindsorControllerFactory() 
    { 
     _container= new WindsorContainer(new XmlInterpreter(new ConfigResource("castle"))); 
     var controllerTypes = from t in Assembly.GetExecutingAssembly().GetTypes() 
           where typeof (IController).IsAssignableFrom(t) 
           select t; 
     foreach(Type t in controllerTypes) 
     { 
      _container.AddComponentLifeStyle(t.FullName, t, LifestyleType.Transient); 
     } 
    } 
    protected override IController GetControllerInstance(Type controllerType) 
    { 
     return (IController)_container.Resolve(controllerType); 
    } 
} 

的Web.Config

<castle> 
    <components> 
     <component id="MenuRepository" 
       service="****.IMenuRepository, ****.Model" 
       type="****.FakeMenuRepository, ****.Model"> 
     </component> 
     <component id="NewsRepository" 
       service="****.INewsRepository, ****.Model" 
       type="****.FakeNewsRepository, ****.Model"> 
     </component> 
    </components> 
    </castle> 

NewsArticleController

public class NewsArticleController : Controller 
{ 
    private INewsRepository _repository { get; set; } 
    public NewsArticleController(INewsRepository repository) 
    { 
     _repository = repository; 
    } 

的Global.asax

protected void Application_Start() 
    { 
     RegisterRoutes(RouteTable.Routes); 
     ControllerBuilder.Current.SetControllerFactory((new WindsorControllerFactory())); 
    } 

錯誤信息 支持服務****號成分NewsArticleController發現 說明:當前Web的執行過程中發生未處理的異常請求。請查看堆棧跟蹤以獲取有關該錯誤的更多信息以及源代碼的位置。

Exception Details: Castle.MicroKernel.ComponentNotFoundException: No component for supporting the service ****.NewsArticleController was found 

Source Error: 

Line 29:   protected override IController GetControllerInstance(Type controllerType) 
Line 30:   { 
Line 31:    return (IController)_container.Resolve(controllerType); 
Line 32:   } 
Line 33:  } 
+0

這是一個愚蠢的問題,我敢肯定,但以防萬一:您的web.config中實際上沒有星號,對不對?你只是把這些放在模糊的實際命名空間?在我進一步挖掘之前檢查。 – nkirkes 2009-05-22 06:28:13

+0

呵呵,是的,但是如果你計算每個星星的點數,你會發現它們是獨一無二的! - 否:) – Chance 2009-05-22 12:38:54

回答

2

在S#arpArchitecture項目有使用溫莎作爲DI框架的體面implentation(用於控制器或其他任何東西),很少或根本沒有必要添加的web.config部分 - http://code.google.com/p/sharp-architecture/

代碼示例:

CastleWindsor/ComponentRegistrar.cs:

public class ComponentRegistrar 
{ 
    public static void AddComponentsTo(IWindsorContainer container) { 
     AddGenericRepositoriesTo(container); 
     AddCustomRepositoriesTo(container); 

     container.AddComponent("validator", 
      typeof(IValidator), typeof(Validator)); 
    } 

    private static void AddCustomRepositoriesTo(IWindsorContainer container) { 
     container.Register(
      AllTypes.Pick() 
      .FromAssemblyNamed("Northwind.Data") 
      .WithService.FirstNonGenericCoreInterface("Northwind.Core")); 
    } 

    private static void AddGenericRepositoriesTo(IWindsorContainer container) { 
     container.AddComponent("entityDuplicateChecker", 
      typeof(IEntityDuplicateChecker), typeof(EntityDuplicateChecker)); 
     container.AddComponent("repositoryType", 
      typeof(IRepository<>), typeof(Repository<>)); 
     container.AddComponent("nhibernateRepositoryType", 
      typeof(INHibernateRepository<>), typeof(NHibernateRepository<>)); 
     container.AddComponent("repositoryWithTypedId", 
      typeof(IRepositoryWithTypedId<,>), typeof(RepositoryWithTypedId<,>)); 
     container.AddComponent("nhibernateRepositoryWithTypedId", 
      typeof(INHibernateRepositoryWithTypedId<,>), typeof(NHibernateRepositoryWithTypedId<,>)); 
    } 
} 

Global.asax中(對於二主初始化方法):

protected virtual void InitializeServiceLocator() { 
     IWindsorContainer container = new WindsorContainer(); 
     ControllerBuilder.Current.SetControllerFactory(new WindsorControllerFactory(container)); 

     container.RegisterControllers(typeof(HomeController).Assembly); 
     ComponentRegistrar.AddComponentsTo(container); 

     ServiceLocator.SetLocatorProvider(() => new WindsorServiceLocator(container)); 
    } 
+0

我需要澄清的是,S#arpArchitecture實現具有SharpArch程序集的一部分的其他一些框架位。上面的代碼片段來自他們的Northwind示例MVC應用程序。 – nkirkes 2009-05-22 06:37:21

2

MvcContrib提供了在Windsor註冊控制器,例如一些擴展方法:

windsorContainer.RegisterControllers(Assembly.GetExecutingAssembly()); 

男性化的代碼使用相同的擴展方法。

1

不要忘記WindsorControllerFactory的ReleaseController函數,否則您的工作進程將耗盡內存,因爲控制器未被釋放。