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時,它將初始化所有子控制器,並且每個子控制器將嘗試初始化工廠(已經執行)。
我如何讓工廠實例化所有的子控制器,然後讓它可以從那些子控制器訪問?
這看起來似乎解決了我所遇到的大多數問題,但當頁面有請求時,_childControllerFactory如何設置?我們知道我們不能在構造函數中使用依賴注入,但我想我可以重寫Initialize控制器方法來獲取和設置工廠實例。這會推薦嗎? – 2012-07-24 01:03:50
你是指這個嗎? http://bubblogging.wordpress.com/2012/06/04/mvc-controller-factory/ – dierre 2012-07-24 01:34:49