2009-05-22 12 views
1

私は彼のプロAsp.Net MVC Frameworkの本(素晴らしい本、btw)からSteven Sandersonの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

+0

Hehe、はい、しかし、各星の点数を数えれば、それらが一意であることがわかります! - いいえ:) – Chance

答えて

2

S#arpArchitectureプロジェクトは、web.configファイルのセクションを追加するにはほとんど、あるいはまったく必要とせ、(コントローラまたは他の何かのために)DIフレームワークとしてウィンザーを使用してのまともなimplentationを持っている - 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 implentationにSharpArchアセンブリの一部である他のフレームワークビットがいくつかあることを明確にする必要があります。上記のコードスニペットは、NorthwindのMVCアプリケーションの例です。 – nkirkes

+1

ありがとう、私は問題が何かを考え出したが、これもチェックする。UtilプロジェクトのWindsorControllerファクトリでは、アセンブリへの参照がクラス自体ではなく、初期化のポイントからであると仮定しました。だから、基本的にutilディレクトリでコントローラを検索していました(見つからなかった)。 Goffyの間違い私の部分 – Chance

2

MvcContribはウィンザー、一例では、コントローラを登録するためのいくつかの拡張メソッドを提供しています:

windsorContainer.RegisterControllers(Assembly.GetExecutingAssembly()); 

マニッシュのコードは同じ拡張メソッドを使用しています。

+1

これは廃止されました。 – Anthony

1

WindsorControllerFactoryでReleaseController関数を忘れないでください。そうしないと、コントローラが解放されていないため、作業プロセスのメモリが不足します。

関連する問題