簡體   English   中英

如何創建一個包含包含工廠的控制器的工廠

[英]How to create a factory containing controllers that contain the factory

我正在嘗試創建一個工廠,該工廠將在字典中保存“子”控制器的列表。 這些子控制器必須包含工廠,以便它們可以訪問其他子控制器。 這是工廠:

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);
}

子控制器均已注冊,並且工廠指定為帶有結構圖的Singleton。

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

如何使工廠實例化所有子控制器,然后從這些子控制器進行訪問?

讓我們考慮一下。 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);
}

我沒有對其進行測試,但是我看不到具體對象在工廠中傳遞工廠的必要性,因為您將這些對象的字典存儲在工廠中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM