2009-08-04 30 views
1

複数のコントローラ間でいくつかのオブジェクトを共有しようとしています。これを行う最善の方法は何ですか。私はシングルトンを避けたいと思いますが、可能ならばこれらを注入したいのですが、asp.net mvcを使うとコントローラを "新しくしていない"ので、どんな助けもありがたいです。asp.net mvc - コントローラがオブジェクトを共有する最良の方法は何ですか?

+0

何を共有しようとしていますか?一般的なデータはビューに送信されますか? – Martin

+0

共通サービス。 。 – leora

答えて

2

私がMVCを使い始めたとき、同じ問題がありました。それから、IoC(Inversion of Control)コンテナと依存性注入について学びました。これらのことがどれくらいのことを可能にするかは非常に驚きです。

このプロジェクトは、Castle Windsor、NHibernate、およびASP.NET MVCを1つのパッケージに統合しています。 http://code.google.com/p/sharp-architecture/

自分でやりたいことは、好きなIoCコンテナを選ぶことです。そこにいくつかのバインディングがMVCのためにある、またはあなた自身をロールバックすることができます。独自の方法を使用する場合は、IControllerFactoryを実装し、工場を使用するようにMVCを設定する必要があります。ここは私のものです。

public class ControllerFactory : IControllerFactory 
{ 
    private readonly IDependencyResolver _controllerResolver; 

    private RequestContext RequestContext { get; set; } 

    public ControllerFactory(IDependencyResolver controllerResolver) 
    { 
     _controllerResolver = controllerResolver; 
    } 

    public void ReleaseController(IController controller) 
    { 
     _controllerResolver.Release(controller); 

     var disposableController = controller as IDisposable; 

     if (disposableController != null) 
      disposableController.Dispose(); 
    } 


    public IController CreateController(RequestContext requestContext, string controllerName) 
    { 
     Assert.IsNotNull(requestContext, "requestContext"); 
     Assert.IsNotNullOrEmpty(controllerName, "controllerName"); 

     RequestContext = requestContext; 

     try 
     { 
      var controllerInstance = _controllerResolver.Resolve<IController>(controllerName.ToLower() + "controller"); 
      return controllerInstance; 
     } 
     catch(Exception ex) 
     { 
      throw new HttpException(404, ex.Message, ex); 
     } 
    } 

} 
関連する問題