「子」コントローラのリストを辞書に保持するファクトリを作成しようとしています。これらの子コントローラーには、他の子コントローラーにアクセスできるように、ファクトリが含まれている必要があります。ここに工場があります:
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);
}
子コントローラはすべて登録され、ファクトリは構造マップを持つシングルトンとして指定されます。
子コントローラーにはファクトリーが必要なため、依存性注入を使用してコンストラクターでファクトリーを設定すると、循環参照が発生します。これは、ファクトリーが最初に初期化されるときに、すべての子コントローラーが初期化され、各子コントローラーがファクトリーを初期化しようとするためです (これは、すでに実行されています)。
ファクトリですべての子コントローラをインスタンス化し、それらの子コントローラからアクセスできるようにするにはどうすればよいですか?