2010-01-15 24 views

回答

1

你不應該爲容器保留一個明確的引用。一個容器應該連接請求的對象圖(在這種情況下是控制器)並且避開它。

看看在MVCContrib中IControllerFactory的容器特定實現。

這麼說,我喜歡WindsorControllerFactory很多比UnityControllerFactory更好,但你可以實現使用相同的模式(構造器注入)作爲WindsorControllerFactory一個UnityControllerFactory。

如果你想像我們這樣做,你的Global.asax應該是這樣的:

var container = new UnityContainer(); 

// configure container 

var controllerFactory = new UnityControllerFactory(container); 
ControllerBuilder.Current.SetControllerFactory(controllerFactory); 

controllerFactory持有到容器的引用,這樣你就可以讓它走出去的範圍中的Application_Start - 這是怎麼回事留下來,因爲ControllerFactory停留在周圍。

+0

將這個例子中是可取的,除了剛剛控制器工廠的事情?我正在研究如何使用其正確的存儲庫(員工存儲庫,Emailer存儲庫等)連接域邏輯類。 – Maslow 2010-01-15 14:39:49

+0

是的。如果它是ASP.NET MVC,它們都需要通過控制器。讓容器將Presentation層服務注入到控制器中;將域對象放入表示層服務中;存儲到域對象中,等等。 – 2010-01-15 15:09:27

0

下面是我們如何做到了:

public class UnityControllerFactory : DefaultControllerFactory 
{ 
    private IUnityContainer container; 

    public UnityControllerFactory(IUnityContainer container) 
    { 
     this.container = container; 
    } 

    public static void Configure() 
    { 
     IUnityContainer container = new UnityContainer(); 
     //...Register your types here 

     ControllerBuilder.Current.SetControllerFactory(new UnityControllerFactory(container)); 
    } 

    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) 
    { 
     if (controllerType == null) 
     { 
      return base.GetControllerInstance(requestContext, controllerType); 
     } 

     if (!typeof(IController).IsAssignableFrom(controllerType)) 
     { 
      throw new ArgumentException("Type requested is not a controller", "controllerType"); 
     } 

     return container.Resolve(controllerType) as IController; 
    } 
} 

然後在的global.asax.cs

public class MvcApplication : System.Web.HttpApplication 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     .... whatever you like 
    } 

    protected void Application_Start() 
    { 
     RegisterRoutes(RouteTable.Routes); 
     UnityControllerFactory.Configure(); 
    } 
} 
+0

這個例子對於除了控制器以外的東西使用統一性是否可取? – Maslow 2010-01-15 14:40:30

+0

我相信 - 正如Mark在他最新的答案中所說的那樣,您將始終可以訪問該容器。而且Unity會很高興地構建任何東西:) – Jedidja 2010-01-15 14:45:30

+0

理論上,控制器會依賴於存儲庫(或使用存儲庫的服務),所以最終都會通過Unity構建一切。 – Jedidja 2010-01-15 14:58:27

相關問題