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

子コントローラはすべて登録され、ファクトリは構造マップを持つシングルトンとして指定されます。

子コントローラーにはファクトリーが必要なため、依存性注入を使用してコンストラクターでファクトリーを設定すると、循環参照が発生します。これは、ファクトリーが最初に初期化されるときに、すべての子コントローラーが初期化され、各子コントローラーがファクトリーを初期化しようとするためです (これは、すでに実行されています)。

ファクトリですべての子コントローラをインスタンス化し、それらの子コントローラからアクセスできるようにするにはどうすればよいですか?

4

1 に答える 1

1

これについて考えてみましょう。AchildControllerは、Factory 権限を割り当てられている場合にのみ機能しますか? したがって、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);
}

私はそれをテストしませんでしたが、このオブジェクトのディクショナリをファクトリに格納しているため、具体的なオブジェクトがコンストラクタにファクトリを渡す必要があるとは思いません。

于 2012-07-24T00:11:02.300 に答える