2012-07-23 94 views
0

我試圖創建一個工廠,它將在字典中包含「子」控制器列表。這些子控制器必須包含工廠,以便他們可以訪問其他子控制器。這裏是工廠:如何創建一個包含工廠控制器的工廠

public interface IChildControllerFactory 
{ 
    IChildController GetChildController(object item); 
} 


public class ChildControllerFactory : IChildControllerFactory 
{ 
    private Dictionary<string, IChildController> _childControllerDictionary; 

    public ChildControllerFactory(IEnumerable<IChildController> childControllers) 
    { 
     var childControllerDictionary = new Dictionary<string, IChildController>(); 

     //code to build dictionary 
     _childControllerDictionary = childControllerDictionary; 
    } 

    public IChildController GetChildController(object item) 
    { 
     return _childControllerDictionary.Where(x => x.Key == item.GetType().Name).Select(x => x.Value).First(); 
    } 
} 

下面是一個子控制器的例子:

public class ChildController : Controller, IChildController<TViewModel, TModel> 
{ 
    private IChildControllerFactory _childControllerFactory; 

    public ChildController(IChildControllerFactory childControllerFactory) //this will cause a circular reference 
    { 
     _childControllerFactory = childControllerFactory; 
    } 

    public ActionResult GetChildViewModel(object child) 
    { 
     var model = _childControllerFactory.GetChildController(child).ToViewModel(survey); 
     return PartialView("Child.ascx", model); 
    } 
} 

而且繼承接口:

public interface IChildController<TViewModel, TModel> 
{ 
    int Create(object item); 
    object Save(object item); 
    object ToViewModel(object item); 
} 

子控制器都註冊,工廠被指定爲具有Structure Map的Singleton。

由於子控制器需要Factory,所以在使用依賴注入的構造函數中設置工廠將導致循環引用,因爲初次初始化Factory時,它將初始化所有子控制器,並且每個子控制器將嘗試初始化工廠(已經執行)。

我如何讓工廠實例化所有的子控制器,然後讓它可以從那些子控制器訪問?

回答

1

讓我們來思考一下。 A childController只有在分配工廠權限後才能使用?所以在創建childFactory之前,childControll事實上是無用的。這說我會做這樣的事情:

public class ChildController : Controller, IChildController<TViewModel, TModel> 
{ 
    private IChildControllerFactory _childControllerFactory; 

    public ChildController() 
    { 
    } 

    public void setChildControllerFactory(IChildControllerFactory childControllerFactory) 
    { 
     _childControllerFactory = childControllerFactory; 
    } 

    public ActionResult GetChildViewModel(object child) 
    { 
     var model = _childControllerFactory.GetChildController(child).ToViewModel(survey); 
     return PartialView("Child.ascx", model); 
    } 
} 

所以你ChildControllerFactory會是這樣:

public ChildControllerFactory(IEnumerable<IChildController> childControllers) 
{ 
    var childControllerDictionary = new Dictionary<string, IChildController>(); 
    _childControllerDictionary = childControllerDictionary; 
    for(IChildController i in _childControllerDictionary) i.setChildControllerFactory(this); 
} 

我沒有測試,但我沒有看到具體對象的必要性有工廠在構造函數中傳入,因爲您在工廠中存儲了此對象的字典。

+0

這看起來似乎解決了我所遇到的大多數問題,但當頁面有請求時,_childControllerFactory如何設置?我們知道我們不能在構造函數中使用依賴注入,但我想我可以重寫Initialize控制器方法來獲取和設置工廠實例。這會推薦嗎? – 2012-07-24 01:03:50

+0

你是指這個嗎? http://bubblogging.wordpress.com/2012/06/04/mvc-controller-factory/ – dierre 2012-07-24 01:34:49